2012-10-04 10 views
20

Paul Hegarty kursunda bir iOS 5 eğitimini takiben, bu kodu GCD kullanımını gösteren bir uygulamada görüyoruz. Görünüşe göre, GCD, hangi nesnelerin hala ihtiyaç duyulduğu konusunda önceden tahmin edilemeyen çok iş parçacıklılıktan kaynaklanan sorunlar nedeniyle serbest bırakılmasını gerektiriyor.iOS 6.0'da ARC kapsamında GCD kuyruklarını serbest bırakmanız mı gerekiyor?

dispatch_async(dowloadQueue, ^{ 
    .... 
    // do some stuff 
    .... 
    }); 
    dispatch_release(dowloadQueue); 

Ben iOS 6 ve XCode 4.5 yükseltilmiş ve ben bir olsun "ARC açık bırakılmasını yasaklamaktadır ..." Ben iOS 5/XCode altında bu kodu deneyin vermedi

mesajı 4.2

Bunun nedeni, ARC'nin daha akıllıca olması ve artık GCD'de serbest bırakılmaya ihtiyacım olmaması mı? Yoksa sadece yanlış anlaşıldım mı?

cevap

29

Mountain Lion ve iOS 6.0'ı hedeflediğinizde, ARC artık gönderim sıralarını ve diğer GCD türlerini sizin için yönetecektir. OS X veya iOS'un önceki sürümlerini hedeflerseniz, GCD türlerini açık bir şekilde saklamanız ve serbest bırakmanız gerekecektir (yalnızca iş güvenliği nedeniyle değil, aksi halde belleği kaybedersiniz), ancak yalnızca daha yeni işletim sistemini hedeflediğinizde bu işlem sizin için ele alınır. sürümleri.

Bu nedenle, iOS 6.0'ı hedeflerken ARC kapsamında böyle bir derleyici hatası görüyorsunuz.

+0

Kuyruğu oluştururken Object-C'ye __bridge_transfer gerekir mi? – openfrog

+0

@openfrog - Hayır, bir Objective-C nesnesi olarak ele alınırsa, zaten ARC tarafından ele alınır, bu yüzden aktarmaya gerek yoktur. –

+0

@BradLarson Bunu kapatmak için bir yol var mı? Ya da, hem iOS 5 hem de iOS 6 altında derlenmesini sağlamak için nasıl yazarım? – fishinear