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.
Teşekkürler, açık bir açıklama ve doğru satırlarda olduğumu doğruladım :) – Martin
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. –