SORU
31 Ocak 2012, Salı


Objective-C: Neden autorelease (@autoreleasepool) hala ARC ile gerekli midir?

ARC ile çoğunlukla (Otomatik Referans Sayma), Objective-C nesne ile bellek yönetimi hakkında düşünmene gerek yok. NSAutoreleasePooller artık, ancak yeni bir sözdizimi vardır oluşturmak için izin verilmez:

@autoreleasepool {
    …
}

Benim sorum, neden şimdiye kadar el ile/autoreleasing serbest olması gerekiyordu değilim bu ne zaman ihtiyacım olur ?


EDİT: tüm bölgedeki okullarda da ilk sıraları elime ne özetlemek ve öz bir yorum:

Yeni Sözdizimi

@autoreleasepool { … } için yeni bir sözdizimi

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];

Daha da önemlisi,

  • ARC de serbest olarak autorelease kullanır
  • Yerde autorelease yüzme havuzu çok ihtiyacı var
  • ARK senin için autorelease havuzu yaratmazancak,
  • Her Kakao uygulamanın ana iş parçacığı zaten autorelease yüzme havuzu vardır
  • @autoreleasepoolkullanmak isteyebilirsiniz zaman iki durum vardır
    • İkincil bir iş parçacığı ve otomatik yayın havuzu yok, kendi sızıntıları, myRunLoop(…) { @autoreleasepool { … } return success; } gibi önlemek için yapmanız gerekir
    • Daha yerel bir havuz oluşturmak istediğiniz zaman, mattjgalloway cevabı olarak gösterdiği gibi

CEVAP
31 Ocak 2012, Salı


ARC tutar, yayımlar ve autoreleases kurtulmak değil, sadece size gerekli olanları ekler. Hala korumak için aramalar var, hala serbest bırakmak için çağrı var, hala autorelease çağrı var ve hala auto release havuzları var.

Yeni Çınlama 3.0 derleyicisi ve YAY ile yapılan diğer değişikliklerden biri @autoreleasepool derleyici Direktifi ile NSAutoReleasePool değiştirdiler. NSAutoReleasePool her zaman biraz özel bir "nesne" zaten onlar yaptı, böylece sözdizimi kullanarak değil kafası karışık olan bir nesne, böylece genel olarak biraz daha basit.

Yani temelde, hala auto release havuzları endişe var çünkü @autoreleasepool gerekir. Sadece autorelease çağrıları ekleme hakkında endişelenmenize gerek yoktur.

Otomatik serbest yüzme havuzu kullanarak bir örnek:

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000;   j) {
        @autoreleasepool {
            for (int i = 0; i < 10000;   i) {
                NSNumber *number = [NSNumber numberWithInt:(i j)];
                NSLog(@"number = %p", number);
            }
        }
    }
}

Son derece yapmacık bir örnek, elbette, ama eğer yok @autoreleasepool iç-dış fordöngü sonra olursun bırakmadan 100000000 nesneleri daha sonra yerine 10000 her zaman yuvarlak dış fordöngü.

Güncelleme: Ayrıca bu cevap - http://stackoverflow.com/a/7950636/1068248 - @autoreleasepool ARC ile ilgisi için bkz.

Güncelleme: Burada ve wrote it up on my blog ne iç içine bir göz attım. Eğer siz bir bakın o zaman göreceksiniz ARC tam olarak ne yaptığını ve nasıl yeni stil @autoreleasepool ve nasıl tanıtır, bir kapsam tarafından kullanılan derleyici için anlaması bilgiler hakkında ne korur, bültenleri & autoreleases gereklidir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BSA

    BSA

    9 NİSAN 2012
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • LiveForGodsKingdom

    LiveForGodsK

    6 NİSAN 2008