2011-06-08 21 views
8

Basit bir komut satırı programında bir kod ile etrafa oynayarak Objective-C öğreniyorum, burada benim kodum:Bir Objective-C komut satırı programı bir NSAutoreleasePool gerektirir mi?

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main(int argc, char** argv) 
{ 
    NSString *hello = @"hello world"; 

    printf("msg: %s\n", [hello UTF8String]); 

    return 0; 
} 

Derlediğim gibi çalıştırıyorum:

gcc test.m -o test -ObjC -framework Foundation 
./test 

çıktıyı takip eden:

2011-06-08 20:35:21.178 test[10220:903] *** __NSAutoreleaseNoPool(): Object 
0x10010c8b0 of class NSCFData autoreleased with no pool in place - just leaking 
msg: hello world 

Bu hatanın NSAutoreleasePool olmadığı gerçeğini ifade ettiğini ve bir tane eklediğimde hatanın ortadan kalktığını görebiliyorum:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main(int argc, char** argv) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSString *hello = @"hello world"; 

    printf("msg: %s\n", [hello UTF8String]); 

    [pool release]; 

    return 0; 
} 

NSString vb. gibi nesneleri kullanan ve Foundation'a derleme yapan bir komut satırı uygulamasının manuel olarak oluşturulacak bir otomatik havuz oluşturduğunu varsayarak mı? Benim örneğim bunu yapmanın en iyi yoludur?

Not: Ayrıca [hello release] yapmaya çalıştım; NSAutoreleasePool olmadan, bir havuzu kullanmadan yalnızca el ile belleği temizleyip kaldıramayacağımı, ancak aynı sorunu aldığımı görmek için.

cevap

9

Evet ve evet.

Kakao (GUI veya Hazırlık biçiminde olan) bir sallanmasını havuzu mevcut olmasını bekler; çerçevenin (sadece kendi kodu) internal'leri -autorelease mesajı ve havuzların liberal faydalanmak ve sallanmasını havuzu yığını üzerinde herhangi havuzları yoksa, bundan şikayetçiyiz ve sizin gibi nesneleri sızıntı 'gördüm.

Sana çöp toplama kapalı olduğunu varsayıyorum; Bununla hiç geliştirmedim, ama bu durumda buna ihtiyacın olmadığını hayal edebiliyorum.

Güncelleme sallanmasını havuzlar artık aynı etkiye sahip bir @autoreleasepool {...} blok, ve sadece bunun dışında dönmek/atlamak yeteneği gibi bazı güzel ikramiye kullanılarak oluşturulabilir.

+0

Teşekkürler, açık bir açıklama ve doğru satırlarda olduğumu doğruladım :) – Martin

+1

Otomatik olarak çalıştırma yöntemini (örneğin her zaman açıkça 'ayırma', 'init' ve 'nesnelerinizi serbest bırakın', ancak bu oldukça nadirdir ve neredeyse hiçbir zaman kitaplık işlevlerini aramayan oyuncak programlarında olur. –

İlgili konular