Я изучаю Objective-C, играя с некоторым кодом в простой программе командной строки, вот мой код:
#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;
}
Я компилирую и запускаю его так:
gcc test.m -o test -ObjC -framework Foundation
./test
и получите следующий вывод:
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
Итак, я вижу, что ошибка относится к тому факту, что NSAutoreleasePool отсутствует, и когда я добавляю его, ошибка исчезает:
#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 и т. Д. И компилирует против Foundation, требует, чтобы пул автоматического выпуска создавался вручную? И мой пример выше, лучший способ сделать это?
Примечание: я также попытался [привет отпустить]; без NSAutoreleasePool, чтобы посмотреть, смогу ли я просто очистить память вручную без использования пула, но получил ту же проблему.