6

Bir uygulama içinde (örneğin, ios5) bir yöntemde bir örneğe başvurmak için bir bloğun içinde kullanılan zayıf değişkeni bildirir. bir görünüm denetleyicisi.Objective-C ARC __weak değişken başvurusu "__weak özniteliği otomatik değişkende belirtilemez" uyarısını tetikler

__weak nitelik Bu uygulamada otomatik değişken

üzerinde belirtilemez Ben çok zayıf başvuruları kullandım:

QRCodeViewController * __weak weakSelf = self; 

sorun derleyici söyleyen bir uyarı gösterir olmasıdır ve hiç böyle bir uyarı görmedim, diğer sınıflardan tek fark, bu sınıf bir .mm dosyasında uygulandığı için bir C++ nesnesi kullandığından ve proje bir .m olarak bırakılırsa derleyemem.
Kodun düzgün çalıştığını söylemeliyim.
Herhangi bir öneriniz var mı?

+0

o '__weak QRCodeViewController * weakSelf = öz olmamalı;'? –

+2

@Martin ya bir çalışır, onlar eşdeğerdir, senin yolun daha sık kullanıldığını görüyorum, ama Andrea'nın yolu Apple'ın önerdiği yoldur. –

+0

Benzer soru: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-to-self. Cevap, dağıtım hedefinin 4.0 olarak ayarlandığını, ancak sizin için böyle olmadığını söyledi. Doğru? –

cevap

4

, ben bir __block kullanarak ortadan aşağıdaki şekilde bağlıyor:

__block __weak MyViewController* weakSelf = self; 
+0

Peki işe yarıyor !! – Andrea

0

Uyarının neden __weak belirtilemediğini söyleyemediğinden emin değilim. AFAIK, otomatik değişkenler için __weak'u kullanmak çok tehlikeli olsa bile, bunu belirtmek mümkün olmalıdır.

Apple belgeleri, derleyicinin bir uyarı sunacağını söylüyor, ancak asıl uyarı metni, yalnızca kullanımının tehlikeli olduğunu değil, yalnızca belgelerin yok sayılacağını ima ediyor. Tehlikeli ama beklendiği gibi çalışır (gerçekten ne beklediğinizi anlarsanız).

Uyarı metninin uygun olmadığını veya belgelerin doğru şekilde güncellenmediğini doğrulamak için biraz deneme yapmanız gerekir. Bu aynı uyarıyı bakan

+0

Merhaba Analog Dosya, cevabınız için teşekkürler, gerçekte döngüleri korumak için bir Blok'a geçmek istediğiniz nesneler için zayıf referanslar oluşturmak normaldir. Kodumda hiçbir uyarı yapmadan tonlarca yaptım. Otomatik değişkenin zayıf olmasının tehlikeli olduğunu veya daha iyi bir anlam ifade etmediğini kabul ediyorum çünkü asenkron işlem için bir blokta kullanacağınız zaman, değişken çok güçlü bir referansa sahip olmadığı için yok oluyor. Ama burada kendimi otomatik değişkeni olmayan ve sınıfın kendisinin varlığıyla güçlü olarak adlandırılan kendimi atadım. – Andrea

+0

Bu saçmalık değil. Söylediğiniz gibi mükemmel makul kullanım durumları var. Ama bu tehlikeli. Eşzamansız blok örneğiniz nokta üzerinde (pek çok insanın neden çalışmadığını anlamakta sorun yaşayacaktır). Bu, Apple'ın seçimini yasal hale getirmenin ve uyarıda bulunmanın ardındaki mantıktır.Çalıştığını doğruladıysanız, sorunun genellikle uyarı metninde olduğunu tahmin ediyorum (uyarıcı geliştiricilerin belgelere göre bilinçli bir kararıdır). Bu ayrıca bir hata olarak ifade edilmiş olsa bile sadece bir uyarıdır. –

+1

@AnalogFile: __weak otomatik değişkenlerle kullanılıyorsa derleyicinin bir uyarı verdiği söylenen Apple belgelerine bir başvuru var mı? Teşekkür ederim! –