"self.delegate = self", ARC kullanarak iOS'ta çalışmıyor

ARC etkin bir iOS SDK 4 projesi üzerinde çalışıyorum.

Sınıfım MyTextView ( UITextViewDelegate protokolüyle UITextView'dan türetilmiş) aşağıdaki statik yöntemi uygular:

+ (void)showInViewController:(UIViewController*)viewController
{
    MyTextView *textEdit = [[MyTextView alloc] init];
    textEdit.delegate = textEdit;
    [viewController.view addSubview:textEdit];

   //Show the keyboard
    [textEdit becomeFirstResponder];
}

Görünüm denetleyicilerimden birinde şunları ararım:

[MyTextView showInViewController:self]

Bu, uyarısı ile kilitlenir: beFirstResponder öğesinde daha önce seçilen kareyi geri yükleyemedi. . Bazı döngü nedeniyle yığınla ilgili çökmesine benziyor. ARC için oldukça yeni. UITextView temsilci özelliği atama olarak tanımlanır (ARC bunu zayıf olarak yorumlamamalıdır?). Bu yaklaşımın oldukça garip bir hafıza olduğunu biliyorum. Ancak, ARC'nin bunun gibi şeyleri halledip edemeyeceğini bilmek istedim. Açıkçası, yapamaz. Sorun ne olabilir ve nasıl çözülür?

2
Teşekkürler Caleb. Başlığı buna göre değiştirdim.
katma yazar Lars Schneider, kaynak
Sorun, temsilci ataması veya addSubview çağrısının textEdit nesnesinde bir "tutma" gerçekleştirmeyeceği gibi görünüyor. Sonuç olarak, yöntemin sonunda piyasaya sürülecektir.
katma yazar Lars Schneider, kaynak
@chrispix: Haklısınız - en azından ARC bilge değil. Aslında bu benim çözümümdü. Çağrı görünümü denetleyicisinde MyTextView nesnesinin güçlü bir referansını tutar. Ancak, ARC'nin bu şeyleri halledip edemeyeceğini merak ettim (ama ARC, her şeyden önce çöp toplama değil).
katma yazar Lars Schneider, kaynak
@chrispix: Hayır, gerçek nesneye bir işaretçi döndürmek için sınıf yöntemini değiştirdim.
katma yazar Lars Schneider, kaynak
Döngüleri koru genellikle çökmelere sebep olmaz - sadece nesnelerin ayrılmasının önlenmesi.
katma yazar Caleb, kaynak
Özel sorunun ne olduğundan emin değilim, ama bu yaklaşım gerçekten sorunlu görünüyor. showInViewController: komutunu uyguladıktan sonra MyTextView örneğine başvurunuz yoktur. Süper görüşüyle ​​korunmalıdır, ancak başvurmak için iyi bir yolunuz yoktur, bu yüzden iletileri iletemez veya metnin değerini çıkaramazsınız. Üzerinde bir ele geçirmenin tek yolu, onun superview'in alt görünümlerini gezmek olabilir.
katma yazar Christopher Pickslay, kaynak
MyTextView nesnesine güçlü bir referansı nasıl saklıyorsunuz? Boşluk veren bir sınıf yöntemini çağırarak oluşturursunuz.
katma yazar Christopher Pickslay, kaynak
O zaman sorudaki kodu güncellemeniz gerekir.
katma yazar Christopher Pickslay, kaynak
Bu garip bir modeldir (bir bakış açısına sahip olmak kendi temsilcisidir), ancak bu, konunun delegeyi belirleyen satırı (yani temsilci ayarlanmadı) yorumlayarak sorunun olup olmadığını kontrol edin ve kilitlenmenin hala devam edip etmediğini kontrol edin.
katma yazar XJones, kaynak
Atama zayıf ile aynı değildir. Zayıf atama gibi bir şeydir, ancak güçlü referansların tümü serbest bırakıldığında zayıf bir değişken sıfırlanır.
katma yazar James, kaynak
Bir atama özelliği, iOS 4 için derleme yapılırken güvenli olmayan_sayısı verilen özelliği ile sonuçlanır.
katma yazar Alex Nichol, kaynak
Bunu bir cevap haline getirecek kadar bile emin değilim, ama belki [süper setDelegate: self]; çözer.
katma yazar Aberrant, kaynak

2 cevap

ARC ve bellek yönetimi ile ilgili bir şey olduğunu sanmıyorum, ancak UITextView 'un kendisinin bir delege olamayacağı daha temel bir problem. Bir döngüde kilitlenir. textViewDidChangeSelection 'a bir giriş iletisi koyun ve tekrar tekrar çağırıldığını görürsünüz. Bir bellek sorunu değil, metreler değil, yalnızca UITextView delegeleriyle bir mantık sorunu. Sorunlu showInViewController 'ı yapmasanız da, standart bir UITextView alt sınıfı oluşturun ve temsilcisini kendi başına ayarlamaya çalışsanız bile, aynı meraklı davranışları göreceksiniz.

1
katma