Olumsuz tarafı yok. Kullan onu. Bugün yap. Eski kodunuzdan daha hızlıdır. Eski kodunuzdan daha güvenlidir. Eski kodunuzdan daha kolaydır. Çöp toplama değildir. GC çalışma zamanı ek yükü yoktur. Derleyici ekler, sahip olmanız gereken her yerde saklar ve yayınlar. Ancak sizden daha akıllıdır ve gerçekte ihtiyaç duyulmayanları optimize edebilir (tıpkı döngüleri açabilmesi, geçici değişkenleri ortadan kaldırması, satır içi işlevler vb. Gibi)
Tamam, şimdi size küçük olumsuzluklardan bahsedeceğim:
Uzun süredir ObjC geliştiriciyseniz, ARC kodunu gördüğünüzde yaklaşık bir hafta boyunca seğireceksiniz. Bunu çok çabuk aşacaksın.
Core Foundation koduna köprü oluşturmanın bazı (çok) küçük komplikasyonları vardır. "A" id
olarak kabul edilen herhangi bir şeyle uğraşırken biraz daha fazla karmaşıklık vardır void*
. C dizileri gibi şeylerin id
doğru yapılması için biraz daha düşünmek gerekebilir. ObjC'nin süslü kullanımı va_args
da soruna neden olabilir. Bir ObjC işaretçisinde matematikle ilgili çoğu şey daha yanıltıcıdır. Her halükarda bundan fazlasına sahip olmamalısın.
Bir koyamazsınız id
bir yer struct
. Bu oldukça nadirdir, ancak bazen verileri paketlemek için kullanılır.
Doğru KVC isimlendirmesini takip etmediyseniz ve ARC ile ARC olmayan kodu karıştırırsanız, hafıza problemleriniz olacaktır. ARC, bellek yönetimi hakkında kararlar almak için KVC adlandırmasını kullanır. Hepsi ARC koduysa, o zaman önemli değil çünkü her iki tarafta da aynı "yanlış" yapacaktır. Ancak karışık ARC / ARC olmayan ise, o zaman bir uyumsuzluk vardır.
ARC, ObjC istisna atışları sırasında bellek sızdırır. Bir ObjC istisnası, programınızın sonlandırılmasına çok yakın olmalıdır. Önemli sayıda ObjC istisnası yakalıyorsanız, bunları yanlış kullanıyorsunuz demektir. Bu, kullanılarak düzeltilebilir -fobjc-arc-exceptions
, ancak aşağıda tartışılan cezalara tabidir:
ARC, ObjC ++ kodunda ObjC veya C ++ istisnası atışları sırasında bellek sızdırmaz, ancak bu hem zaman hem de alan performansı pahasına olur. Bu, ObjC ++ kullanımınızı en aza indirmek için uzun bir nedenler listesinde bir diğeridir.
ARC, iPhoneOS 3 veya Mac OS X 10.5 veya önceki sürümlerde hiç çalışmayacaktır. (Bu, birçok projede ARC kullanmamı engelliyor.)
__weak
işaretçiler iOS 4 veya Mac OS X 10.6'da düzgün çalışmıyor, bu utanç verici, ancak üzerinde çalışılması oldukça kolay. __weak
işaretçiler harika, ancak ARC'nin 1 numaralı satış noktası değiller.
% 95'ten fazla kod için, ARC mükemmeldir ve bundan kaçınmak için hiçbir neden yoktur (işletim sistemi sürüm kısıtlamalarını kaldırabilmeniz koşuluyla). ARC dışı kod için, -fno-objc-arc
dosya bazında aktarabilirsiniz. Xcode maalesef bunu pratikte yapması gerekenden çok daha zor hale getiriyor. Bunu basitleştirmek için muhtemelen ARC olmayan kodu ayrı bir xcodeproj'a taşımalısınız.
Sonuç olarak, mümkün olan en kısa sürede ARC'ye geçin ve asla geriye bakmayın.
DÜZENLE
"ARC kullanmak, Cocoa bellek yönetimi kurallarını bilmenin yerini tutmaz" şeklinde birkaç yorum gördüm. Bu çoğunlukla doğrudur, ancak nedenini ve neden olmadığını anlamak önemlidir. İlk olarak, kodunuzun tamamı ARC kullanıyorsa ve Üç Sihirli Kelimeyi ihlal ediyorsanızher yerde, yine de sorun yaşamayacaksınız. Söylemesi şok edici, ama buyrun. ARC, saklamasını istemediğiniz bazı şeyleri saklayabilir, ancak onları da serbest bırakır, böylece asla önemi olmaz. Bugün Cocoa'da yeni bir sınıf öğretiyor olsaydım, gerçek bellek yönetimi kurallarına muhtemelen beş dakikadan fazla zaman harcamazdım ve muhtemelen KVC isimlendirmesini tartışırken sadece bellek yönetimi adlandırma kurallarından söz ederdim. ARC ile, bellek yönetimi kurallarını hiç öğrenmeden iyi bir başlangıç programcısı olabileceğine inanıyorum.
Ama iyi bir ara programcı olamazsın. Core Foundation ile doğru bir şekilde köprü kurmak için kuralları bilmeniz gerekir ve her ara programcının bir noktada CF ile ilgilenmesi gerekir. Ve karışık ARC / MRC kodu için kuralları bilmeniz gerekir. Ve void*
işaretçilerle id
uğraşmaya başladığınızda kuralları bilmeniz gerekir (KVO'yu doğru şekilde gerçekleştirmeye devam etmeniz gerekir). Ve bloklar ... pekala, blok bellek yönetimi çok garip.
Demek istediğim, temel bellek yönetiminin hala önemli olduğu, ancak yeni programcılar için kuralları belirtmek ve yeniden düzenlemek için önemli ölçüde zaman harcadığım yerlerde, ARC ile daha ileri bir konu haline geliyor. Yeni geliştiricilerin kafalarını temel çağrılarla doldurmak yerine nesne grafikleri açısından düşünmelerini tercih ederim objc_retain()
.