2009-04-07 14 views
7

Sanırım farkı biliyorum ama doğru bir şekilde nasıl açıklayacağımı bilmiyorum.[myVar dealloc] ve [myVar release] arasındaki farkı en iyi ne açıklar?

dealloc tamamen ve derhal bu değişken tarafından rezerve belleği kaldırır.

salma -1 ile bu değişkenin bellek sayacı korumak azaltır. Eğer 1 olsaydı, o zaman 0, o anda dealloc ile aynı etkiye sahip olurdu.

bu doğru mu? ya da daha iyi bir kısa açıklama var mı?

cevap

13

Tam olarak doğru.

Ama bir nesne kullanırken sayısıdır korumak bilmiyorum çünkü, dealloc, kullanmak ister. Umurunda değil. Artık, release numaralı telefonu arayarak buna ihtiyacınız olmadığını söylüyorsunuz. Ve kimse yapmadığında, nesne kendi başına dealloc'u arayacaktır.

7

hepsi doğru, ama sen kaçırıyorsun bir anahtar nokta kendinize dealloc hiç aramıyorsun gerektiğidir. İşte NSObject dealloc yöntemi Apple'ın belgelerinden bazı bilgiler verilmiştir:

(http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc itibaren) Doğrudan bir dealloc mesaj göndermez. Bunun yerine, nesne dealloc yöntem aracılığıyla dolaylı serbest NSObject protokolü yöntemi ( alıcının muhafaza sayısında mesaj çıkarım sonuçları 0 olma durumunda) çağrılır. Bkz Bellek Yönetimi hakkında daha fazla ayrıntı için bu yöntemlerin kullanımını Kakao için Kılavuzu Programlama.

alt sınıfları veri için nesne, örneğin dinamik olarak tahsis edilen depolama tüketilen herhangi bir ek bellek arasında serbest izin vermek veya ayırmanın bir amacı ait örnek değişkenler nesneye dealloc kendi sürümlerini uygulamalıdır. sınıfa özel miktarda kaldırma gerçekleştiren sonra alt sınıf yöntemi süper bir mesaj ile üst sınıf sürümleri dealloc ait içermelidir:

+0

sayesinde. Sanırım şimdi biraz kafam karıştı ... bu yüzden, alt sınıfların dürüstlük yöntemlerinde, örnek değişkenlerimi serbest bırakmak zorundayım, değil mi? yani - (void) dümenoktası { \t [yellowViewController dealloc]; \t [blueViewController dealloc]; [süper dealloc]; } – Thanks

+0

Sadece açık olmak gerekirse, super dışındaki hiçbir şeyde dealloc'u asla arama. Thanks 'dealloc yönteminin doğru uygulanması: - (void) dealloc {[yellowViewController release]; [blueViewController sürümü]; [Süper dealloc]; } – rpetrich

+0

Okuduğumu görüyorsunuz Başlangıç ​​iPhone 3 Geliştirme - SDK'yı keşfetme (Ben de sarı/mavi görüntü denetleyici projesini tanıdım). – mk12

İlgili konular