ARC, derleyicinin ne zaman alıkoyma / bırakma çağrıldığını anlamasıyla eski tutma / bırakma (MRC) oynar. GC sistemine göre daha yüksek performans, daha düşük bellek kullanımı ve daha öngörülebilir performansa sahip olma eğilimindedir.
Öte yandan, ARC (veya MRC) ile bazı veri yapısı türleri mümkün değildir, ancak GC bunları idare edebilir.
Örnek olarak, düğüm adında bir sınıfınız varsa ve düğümde bir NSArray alt öğesi ve GC ile "sadece çalışan" üst öğeye yönelik tek bir başvuru varsa. ARC (ve manuel referans sayımı) ile bir sorununuz var. Verilen herhangi bir düğüme, alt öğelerinden ve üst öğesinden de başvurulacaktır.
Sevmek:
A -> [B1, B2, B3]
B1 -> A, B2 -> A, B3 -> A
A kullanırken her şey yolunda (yerel bir değişken üzerinden söyleyin).
İşiniz bittiğinde (ve B1 / B2 / B3), bir GC sistemi sonunda yığın ve CPU kayıtlarından başlayarak bulabileceği her şeye bakmaya karar verecektir. Asla A, B1, B2, B3'ü bulamaz, böylece onları sonlandırır ve belleği diğer nesnelere geri dönüştürür.
ARC veya MRC kullandığınızda ve A ile bitirdiğinizde 3 yeniden sayımına sahiptir (B1, B2 ve B3 tüm referanslar) ve B1 / B2 / B3'ün referans sayısı 1'dir (A'nın NSArray'ı bir referans tutar her biri). Böylece hiçbir şey onları kullanmasa bile, tüm bu nesneler canlı kalır.
Ortak çözüm, bu referanslardan birinin zayıf olması gerektiğine karar vermektir (referans sayısına katkıda bulunmamak). Bu, bazı kullanım modelleri için işe yarayacaktır, örneğin B1 / B2 / B3'e yalnızca A üzerinden başvurursanız. Ancak diğer modellerde başarısız olur. Örneğin, bazen B1'i basılı tutarsanız ve ana işaretçi aracılığıyla geri tırmanmayı ve A'yı bulmayı beklerseniz, yalnızca B1'i basılı tutarsanız zayıf bir referansla A buharlaşabilir (ve normalde B2) ve B3 alabilir Bununla.
Bazen bu bir sorun değildir, ancak karmaşık veri yapılarıyla çalışmanın bazı yararlı ve doğal yollarının ARC / MRC ile kullanımı çok zordur.
Dolayısıyla ARC, GC'nin hedeflediği aynı sorunları hedefler. Bununla birlikte ARC, GC'den daha sınırlı bir kullanım şekli kümesi üzerinde çalışır, bu nedenle bir GC dili (Java gibi) aldıysanız ve ARC gibi bir şey aşıladıysanız, bazı programlar artık çalışmaz (veya en azından tonlarca terk edilmiş bellek üretecekti) ve ciddi takas sorunlarına neden olabilir veya bellek veya takas alanı tükenebilir).
GC, genel bir çözüm olmaya daha fazla öncelik verirken ARC'nin performansa (veya belki öngörülebilirliğe) daha büyük bir öncelik verdiğini de söyleyebilirsiniz. Sonuç olarak GC, öngörülebilir CPU / bellek taleplerine ve ARC'den daha düşük performansa (normalde) sahiptir, ancak herhangi bir kullanım modelini işleyebilir. ARC, birçok yaygın kullanım modeli için çok daha iyi çalışacaktır, ancak birkaç (geçerli!) Kullanım modeli için düşecek ve ölecektir.