Evet ve hayır. Sonunda dize belleğini serbest bırakıp NSAutoreleasePool nesnesini, bunu çöp toplama (bellek tarafından yönetilmeyen) bir ortamda çalıştırırsanız, serbest bırakma yerine boşaltma kullanarak belleğe "sızdırırsınız". Bu "sızıntı", NSAutoreleasePool örneğini, GC altındaki güçlü işaretçileri olmayan diğer nesneler gibi "erişilemez" hale getirir ve nesne, GC'nin bir sonraki çalışmasında temizlenir, bu da aşağıdakilere yapılan çağrıdan hemen sonra olabilir -drain
:
boşaltmak
Çöp toplama ortamında, son toplamadan bu yana ayrılan bellek geçerli eşikten büyükse çöp toplamayı tetikler; aksi takdirde serbest bırakma olarak davranır. ... Çöp toplanan bir ortamda, bu yöntem sonuçta çağırır objc_collect_if_needed
.
Aksi takdirde, -release
GC olmayanlarda nasıl davrandığına benzer , evet. Başkalarının da belirttiği gibi, -release
GC altında işlemsizdir, bu nedenle havuzun GC altında düzgün çalıştığından emin olmanın tek yolu geçmektir -drain
ve -drain
GC -release
olmayanlar altında tam olarak GC olmayanlar gibi çalışır ve tartışmalı olarak işlevselliğini daha açık bir şekilde iletir iyi.
"Yeni, tahsis veya init ile çağrılan herhangi bir şey" ifadenizin "init" içermemesi gerektiğini (ancak "kopya" içermesi gerektiğini) belirtmeliyim, çünkü "init" bellek ayırmaz, sadece nesneyi (yapıcı moda). Tahsis edilmiş bir nesne aldıysanız ve işleviniz yalnızca init'i çağırdıysa, onu serbest bırakmazsınız:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Bu zaten başladığınızdan daha fazla bellek tüketmez (init'in nesneleri somutlaştırmadığını varsayarsak, ancak bunlardan zaten sorumlu değilsiniz).