11

iOS'ta autorelease ile dikkatli olmanız gerektiğini anlıyorum. Arayan tarafından ihtiyaç duyulan bir nesne döndüren bir yöntem var, bu nedenle - bu durumda - anladığım kadarıyla - geri dönmeden önce aradaki nesneye autorelease göndermem gerekiyor.Otomatik yenileme ne zaman Cocoa Touch'da gerçekten bir yayına neden oluyor?

Bu sorun değil, ancak bir kez denetime geri döndüğünüzde (yani düğmem tıklatıldıktan sonra), otomatikleştirme havuzu serbest bırakılmış gibi görünüyor. Bunun nasıl olması gerektiği sanılıyor, ama bu durum için en iyi uygulamanın ne olduğunu merak ediyorum.

Ben nesne serbest bırakılmaz böylece arayan bir retain mesaj gönderme ve daha sonra açıkça dealloc onu bırakmadan başvurdular.

Bu en iyi yaklaşım mı?

cevap

21

Otomatik temizleme havuzu, genellikle çalışma döngüsünün her yinelemesinden sonra serbest bırakılır. Kabaca, her Kakao ve Kakao Dokunmatik uygulaması bu gibi yapılandırılmıştır:

Get the next message out of the queue 
Create an autorelease pool 
Dispatch the message (this is where your application does its work) 
Drain the autorelease pool 

Ne açıklamak beklenen davranıştır. Bir nesneyi bundan daha uzun süre tutmak istiyorsanız, bunu açıkça tutmanız gerekir.

2

Evet, bu en iyi yaklaşım. Otomatik yükleme yalnızca gerçekten bildiğiniz koddaki etkileşimler için tasarlanmıştır. Bir nesneyi depoladıktan sonra, bir referansı tutan nesnenin, nesneyle de işin bitmesine ya da nesneyi tutmanıza gerek kalmadan, kapsam dışı kalmayacağını ve kapsam dışına çıkmayacağını bilmeniz gerekir.

1

Yalnızca, otomatik olarak sonlandırılan nesnelerin, yönteminizin sona ermesinden sonra serbest bırakılacağı garanti edilir. Sonuçta, yönteminizi çağrıştıran yöntem kendi havuzunu oluşturabilir ve yönteminizden sonra onu serbest bırakabilir. autorelease kullanma

+0

başka yöntemde havuzu, bir yöntemde bir havuz oluşturmak bazı nesneleri otomatik salma ve tahliye olabilir, çünkü bu bile, garanti edilmez: Burada –

13

"Nesne, artık seni istemiyorum, ama seni isteyebilirsiniz, bu nedenle henüz sadece ortadan yok başkasına size geçmek için gidiyorum." Diyerek bir yoludur Böylece nesne, bir yöntemden döndürmeniz veya başka bir nesneye vermeniz için yeterince uzun süre dayanacaktır. Bazı kodlar nesneyi korumak istediğinde, bu mülkün retain tarafından sahiplenilmesini talep etmesi gerekir.

autorelease numaralı kitabı doğru kullanabilmek için bilmeniz gereken her şey için the memory management guidelines numaralı telefon numarasına bakın. Açıkçası

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
     NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
     /* Do a search that creates a lot of temporary objects. */ 
     match = [self expensiveSearchForObject:anObject]; 
     if (match != nil) { 
      [match retain]; /* Keep match around. */ 
     } 
     [subPool release]; 
    } 
    return [match autorelease]; /* Let match go and return it. */ 
} 
+0

İyi cevap BUT __is bu kasa__? Bir nesneyi döndürdüğünüz bir nesne var mı? [[[Object alloc] init] autorelease] ', ancak nesne kullanma şansınız olmadan önce gider mi? – bobobobo

+0

@bobobobo: Bellek yönetimi kurallarını takip ediyorsanız değil. 'Autorelease' davranışı oldukça tahmin edilebilir - nesne o anki autorelease havuzunun boşaltılana kadar etrafında kalacak, ki bu da mevcut olay döngüsünün sonuna kadar gerçekleşmeyecek (bilerek daha önce gerçekleşmedikçe).Nesneye bir örnek değişkeni koyarsanız ancak saklamıyorsanız ve daha sonra ona erişmeye çalışırsanız, nesneyi kullanma şansınız olmadan önce nesneyi ortadan kaldıracaksınız - ama bunun nedeni bellek yönetimini kırmış olmanızdır. nesneyi tutmadığın zaman sözleşme yap. – Chuck

3

the Apple Memory Management document sağlanan bir Examle olduğunu. Şüpheli bir tasarım, ancak geçerli: Nesneler havuzun yaratılışından havuzun geri kalanına kadar olan yöntem ne olursa olsun havuzun drenajına kadar sürecek.
İlgili konular