ARC kullanırken ve iOS 4.0'ı hedeflerken zayıf referansları nasıl değiştiririm?


87

İlk iOS uygulamamı Xcode 4.2 ile geliştirmeye başladım ve iOS 5.0'ı bir "yardımcı uygulama" şablonuyla (FlipsideViewController ile birlikte gelen) hedefliyordum.

ARC bir derleme zamanı özelliği olduğu için iOS 4 ile de uyumlu olması gerektiğini okudum, bu yüzden uygulamamı 4.3'e hedeflemeye çalıştım ve derlemeyi denedim. Bunu yaptığımda şu hatayı alıyorum:

FlipsideViewController.m: hata: Otomatik Referans Sayma Sorun: Mevcut dağıtım hedefi otomatik __weak referanslarını desteklemiyor

Bu satırı referans alıyor:

@synthesize delegate = _delegate;

Bu değişken şu şekilde bildirilir:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

"Zayıf referansların" iOS 4'te desteklenmediğini anlıyorum, ancak başlangıçta neden zayıf bir referans kullanmak istediğimi gerçekten anlamıyorum ve kullanmaktan kaçınmak için nasıl yeniden yazacağımı da anlayamıyorum. hala ARC'den yararlanıyor (sonuçta iOS 4 VE 5 ile çalışması gerekiyor değil mi?)

Yanıtlar:


149

Eski işletim sistemini hedeflemek için , mülk bildiriminiz unsafe_unretainedyerine kullanabilirsiniz weakve çoğunlukla aynı şekilde çalışmalıdır. weakreferanslar, hedefleri uzaklaştığında kendilerini sıfırlar, ancak unsafe_unretainedbağlantı kurduğunuz nesnenin serbest bırakıldığında sallanan bir işaretçiye dönüşme olasılığını açık bırakır. İkincisi, assignmanuel bellek yönetiminde bir özellik bildirimi olarak kullanmışsınız gibi aynı davranıştır .

Sen benim cevap söz döngüleri, korumak için bunu yapmanız burada . Orijinal nesneye güçlü bir işaretçiye sahip olabilecek bir şeyin güçlü bir işaretçisine sahip olmak istemezsiniz. O zaman hiçbir şey düzgün bir şekilde serbest bırakılmaz.


Tavsiye için teşekkürler. "Eski işletim sistemini hedeflemek için ..." diyorsunuz. Bu, uygulamanın 5.0'dan daha eski sürümlerinde yalnızca unsafe_unretained'ı kullanmam gerektiği anlamına mı geliyor? Veya kodumda unsafe_unretained'ı kullanabilir miyim ve onu hem 4.x hem de 5.x'i hedefleyecek şekilde oluşturabilir miyim?
Mason G. Zhwiti

1
@Mason - unsafe_unretainedhem iOS 4.x hem de 5.0'da desteklenmektedir, bu nedenle size geriye dönük uyumluluk sağlar. Yalnızca 5.0 sürümlü bir derleme yapıyorsanız, size weaksağladığı ek güvenlikten yararlanmak için geçiş yapabilirsiniz .
Brad Larson

Güvensiz_ tutulmamış denedim, yine de işe yaradı. Ancak, '"** __NSAutoreleaseNoPool (): __NSArrayM sınıfının 0x564bd90 nesnesi, havuz yerinde olmadan otomatik olarak yayınlandı - sadece" *' sızdırıyor, bu normal mi?
beşinci

1
@fifth - Bu tamamen alakasız bir konu. Bir otomatik yayın havuzu yerinde olmadan bir arka plan iş parçacığı üzerinde bir şey çalıştırıyorsunuz. El ile oluşturulan iş parçacığı kendi otomatik yayım havuzuna sahip değildir, bu nedenle kullanarak kendiniz bir tane oluşturmanız gerekir @autoreleasepool(ARC altında, NSAutoreleasePool, daha eski manuel olarak sayılan uygulamalar için).
Brad Larson

@Brad, bu yardımcı oldu, uyarılar gitti, birkaç performSelectorInBackground çağrısı aldım.
beşinci

11

Ek güvenlik için yalnızca zayıf referanslar kullanıyorsanız, mevcutsa yeni çalışma zamanı işlevlerini manuel olarak çağırın ve yoksa __unsafe_unretaineddeğişkenler üzerindeki basit atamaya geri dönün .

ZWRCompatibility.h bunu biraz basitleştirecek.


10

Mike Ash'in uyumluluk kitaplığı PLWeakCompatibilty sayesinde artık __weak'i iOS 4.x'te de kullanabilirsiniz.

Yapılandırması inanılmaz derecede kolaydır ve 5.x üzerinde herhangi bir ek değerlendirme veya çaba gerektirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.