Bir init yönteminde düzgün bir şekilde başarısız olmanın nasıl olduğunu okuyordum ve dokümanlar birbirleriyle aynı fikirde değil gibi görünüyor. Birisi bir istisna atmanızı önerirken, diğerleri temizlemeyi ve geri dönmeyi tavsiye ediyor. Mevcut en iyi uygulama nedir?[self release], [self dealloc] veya [super dealloc]?
cevap
Genel olarak kabul edilen uygulamanın başarısızlığa geri dönmek olduğuna inanıyorum. Ama bir sızıntı önlemek için kendini serbest bırakmak istiyoruz: istisnalarla ilgili
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
Her zaman kullandığım yöntem temizleniyor ve geri dönüyor. Soru başlığından bahsettiğiniz üç yöntem, çağrı hiyerarşisinde segfaultların daha yüksek olmasına neden olurken, geri dönen nil olmaz. Apple'ın kendilerinin başarısızlıktan geri dönmek için söylediklerine inanıyorum. Tutarsızlıkları nerede buluyorsunuz?
Basit bir şekilde geri dönme, belleği ayırma çağrısı, çünkü bir çağrıyı alıkonan bir nesne oluşturacaktır. –
Bellek sızıntısı, kaçınmak istediğim şeydir. docs için – Kevin
Bağlantılar: başlatma sırasında Hata Tespiti - http://tr.im/mlyA bir Initializer Uygulanması - Sen fark edeceksiniz http://tr.im/mlyX ikinci linkte örnek kodu altında bunun yerine bir istisna atmanızı öneriyorlar. Eminim ki şu anki en iyi uygulama değil. – Kevin
Kakao felsefesi sadece bir yönteme yanlış argüman geçirerek gibi programcı hatalardır durumlarda atılmalı olmasıdır. Başka bir şey ters giderse, yöntem sadece NO veya sıfır vermeli ve bir NSError ** "çıkış" parametresi aracılığıyla ayrıntıları bildirmelidir.
Bu, aşağıdaki yordamları içerir. Hata durumu bitmiş üründe yasal olarak meydana gelebilecek bir şeyse, yöntem kendini serbest bırakmalı (sızıntıyı önlemek için) ve geri dönmelidir.
Doğru çözümler (istisnalar ve/veya [self release]; return nil;
) kapsanmıştır, yanlış çözümleri ele alacağım.
Doğrudan dealloc
göndermeyin. Bu release
'un işi. (Ve kodunuz GC altında çalışıyorsa, dealloc
geçersizdir ve yalnızca hangi sorunların neden kaynaklanacağı konusunda spekülasyon yapabilirdim.)
Çiftleri doğrudan göndermek için super
'u kullanmayın. Bu, kendi dealloc
uygulamanızın üzerinden geçecektir.
- 1. dealloc, özellikler için sürüm kullanabilir veya sıfırlanır mı?
- 2. Örnek değişkenlerine doğrudan doğruya erişirken self-> ivar'ın kullanılması
- 3. UIPopovercontroller dealloc popover hala görünürken ulaşıldı
- 4. Dealloc bir denetleyici uyarısı uyarısı
- 5. dealloc içinde dispatch_async güvenli midir?
- 6. Özel dealloc ve ARC (Objective-C)
- 7. a takibi olarak viewDidUnload vs dealloc soru
- 8. Sınıf() vs self .__ class __()?
- 9. Java "self" (statik) referans
- 10. Özellik atanamıyor: 'self' değiştirilemiyor
- 11. "self" anlamı için arama içinde
- 12. [myVar dealloc] ve [myVar release] arasındaki farkı en iyi ne açıklar?
- 13. (self) zaman aralıklarına göre katıl
- 14. 'self' super.init çağrısından önce kullanıldı
- 15. C yönteminden Objective-C "self" nasıl çağrılır
- 16. Bir burun testi sınıfı için (self) yerine __init __ (self) kullanmak için bir dezavantaj var mı?
- 17. objektif-c sınıfı değişkenler: dealloc ne zaman çağrılır?
- 18. Dealloc yöntemini ve Objective C'yi ne zaman çağırır?
- 19. Bir PGP Self Decrypting Arşivini nasıl programlayabilirim?
- 20. NSObject uyumlu sınıflardaki -self yönteminin amacı nedir?
- 21. Neden getattr() öğesi, self .__ dict __. Get()?
- 22. 'get self', example_eval ile aynı mıdır?
- 23. Anonim İşlev/Kapama ve self :: :: statik ::
- 24. Anonim self invoking işlevinden işlevi nasıl gösteririm?
- 25. Nancy Self Host Modül çağırmıyor mu?
- 26. WTForms Form.validate (self) her zaman false döndürür
- 27. `self`'i varsayılan parametre olarak kullan
- 28. Java'nın eşdeğeri [self performSelector: foo afterDelay: 2]
- 29. Self-compiled dalvik paylaşılan kütüphaneleri yüklemiyor
- 30. TypeError: Gerekli 1 konumsal argüman eksik: 'self'
Geri bildirim adamlar için teşekkürler. Yaptığım şey buydu ve doğru yaklaşım olduğu düşünülüyordu, ancak dokümanlardaki diğer iki yönteme yapılan göndermeler, benim bilmem gereken bazı özel durumlar olabileceğini düşünüyordu. – Kevin