it-swarm-tr.com

NSAutoreleasePool otomatik yayın havuzu nasıl çalışır?

Anladığım kadarıyla, alloc , new / veya copy ile oluşturulan her şeyin manuel olarak serbest bırakılması gerekiyor. Örneğin:

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

Sorum şu, bu kadar geçerli olmaz mıydı?

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}
94
James Sumners

Evet, ikinci kod snippit'iniz tamamen geçerlidir.

Her seferinde - autorelease bir nesneye gönderilir, en çok otomatik yayın havuzuna eklenir. Havuz drene edildiğinde, sadece havuzdaki tüm nesnelere serbest bırakma gönderir.

Autorelease havuzları basitçe "sonra" kadar-gönderim erteleme ertelemenizi sağlayan bir kolaylıktır. Bu "daha sonra" birçok yerde olabilir, ancak Cocoa GUI uygulamalarında en yaygın olanı mevcut çalışma döngüsü döngüsünün sonundadır.

65
kperryua

NSAutoreleasePool: tahliye vs. tahliye

drain ve release'nin işlevi karışıklığa neden gibi göründüğü için, burada açıklığa kavuşturmaya değer olabilir (bunun belgelerine ... da dahil edilmiş olmasına rağmen).

Açıkçası, büyük resim açısından drain, release ile değil eşdeğeridir:

Referans sayılan bir ortamda drain, release ile aynı işlemleri yapar, bu nedenle ikisi bu anlamda eşdeğerdir. Vurgulamak için, bu, drain yerine release kullanıyorsanız, değil havuza sızdırıyorsunuz demektir.

Çöp toplayan bir ortamda release bir op-op değildir. Dolayısıyla hiçbir etkisi olmaz. Öte yandan drain, toplayıcıya "gerektiğinde toplaması" gerektiği konusunda bir ipucu içerir. Böylece, çöp toplanmış bir ortamda drain kullanmak sistemin topladığı toplama işlemlerini dengelemeye yardımcı olur.

37
mmalc

Daha önce de belirtildiği gibi, ikinci kod snippet'iniz doğru.

Tüm ortamlarda çalışan otomatik yayın havuzunu kullanmanın daha özlü bir yolunu önermek istiyorum (ref sayımı, GC, ARC) ve ayrıca tahliye/salma karmaşasından da kaçınır:

int main(void) {
  @autoreleasepool {
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
  }
}

Yukarıdaki örnekte lütfen @ autoreleasepool bloğuna dikkat edin. Bu burada belgelenmiştir.

17
Neovibrant

Hayır, sen hatalısın. Belgeler açıkça GC olmayan altında -drain’in -resease’e eşdeğer olduğunu, yani NSAutoreleasePool’un değil sızdırılacağını belirtir.

7
kperryua

Bu bağlantının NSAutoReleasePool: AutoReleasePool 'in ne zaman ve nasıl kullanılacağına dair en iyi açıklamayı verdim.

1
Wayne Lo

bir nesneye salıvermek yerine otomatik yayın göndermek, o nesnenin ömrünü en azından havuzun kendisi boşaltılana kadar uzatır (daha sonra nesne tutulursa daha uzun olabilir). Bir nesne aynı havuza birkaç kez konabilir, bu durumda havuza her konduğunda bir serbest bırakma mesajı alır.

0
Hardik Mamtora

evet, kodunuz mükemmel, eğer çöp toplama kullanıyorsanız, dizeyi sıfırlamanız yeterli olacaktır. Çöp toplama uygulamanızın performansı için iyi değil, bu yüzden kullanmanızı tavsiye etmem: P

0
Antwan van Houdt

Apple'dan okuduklarım: "Otomatik yayın havuzu bloğunun sonunda, blok içinde otomatik yayın mesajı alan nesnelere bir yayın mesajı gönderilir; bir nesneye her mesaj için otomatik yayın mesajı gönderildiğinde bir yayın mesajı alır. blok. "

https://developer.Apple.com/library/mac/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

0
Gagan_iOS