2011-08-17 13 views

cevap

16

Doğrudan bir redaksiyon iletisi göndermezsiniz. Bunun yerine, bir nesnenin dealloc yöntemi, serbest bırakma NSObject protokolü yöntemiyle dolaylı olarak çağrılır (bırakma mesajı alıcının tutma sayısının 0 olmasına neden olursa). Bu yöntemlerin kullanımı hakkında daha fazla bilgi için bkz. Bellek Yönetimi Programlama Kılavuzu.

Alt sınıflar, nesne tarafından tüketilen herhangi bir ek belleğin serbest bırakılmasına izin vermek için kendi ayrılan sürüme geçirme nesnesinin sahip olduğu veri veya nesne örneği değişkenleri için dinamik olarak ayrılmış depolama alanı gibi, kendi dlllloc sürümlerini uygulamalıdır. sınıf özgü miktarda kaldırma yaptıktan sonra, alt sınıf yöntemi süper bir mesaj yoluyla dealloc üst sınıf versiyonlarını içermelidir:

Önemli: Bir uygulama iptal edildiğinde işlemin bellek olduğundan, nesneler bir dealloc mesajı gönderilebilir unutmayın çıkışta otomatik olarak temizlenir - işletim sisteminin tüm kaynakları yönetim yöntemlerini çağırmaktan daha verimli olmasını sağlamak için daha etkilidir. Bu ve diğer nedenlerle, memory management sonucunda denir dealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 
1

Nesne artık gerekmediğinde çalışma zamanı bunu sizin için yapacaktır (çalışma zamanı da karar verir). Sadece düzgün şekilde sakladığınızdan ve bıraktığınızdan emin olun. Diğer nesnelerde dealloc çağırmayın.

2

dealloc kıt kaynaklarını yönetmek olmamalıdır. Bir nesne "retainCount" 0'a ulaştığında, o nesneye otomatik olarak bir dealloc mesajı gönderilir.

Geçersiz kılınmış bir dealloc sonunda [super dealloc]; numaralı çağrı olmadıkça, nesneler üzerinde dealloc'u hiçbir zaman aramamalısınız. -[NSObject dealloc] discussion

göre

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

Ve

Doğrudan bir dealloc mesaj göndermez. Bunun yerine, bir nesnenin dealloc yöntemi, NSObject protokol yöntemiyle dolaylı olarak çağrılır (serbest bırakma mesajı alıcının tutma sayısının 0 olmasını sağlar). Bu yöntemlerin kullanımı hakkında için Memory Management Programming Guide'a bakın.

5

-release böyle NSObject uygulanan düşünün:

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

Ben biraz daha karışık eminim, ancak sorunun cevabı nesnesinin kendisi -dealloc zaman arayacak olmasıdır Onun korunma sayısı sıfıra düşer. Ancak, özel sınıfınız bu davranışı NSObject'ten devralır. Asla, yazmakta olduğunuz kodda kendinizi aramak zorunda kalmazsınız; Nesne düzgün bir şekilde serbest bırakıldığında her zaman otomatik olarak gerçekleşir.

+0

Umarım bu yöntem gövdesi 'tutulması' yerine 'yayın' yerine ' – Saran

+0

@saran'tır, kesinlikle haklısınız. Aptal hatam; Onu yakaladığın için teşekkürler. – Caleb

+1

Gerçekten güzel cevap.Yukarıda bir cevap ver ama cevabın pratikte en iyi olduğunu düşünüyorum. – PJR