Требуется ли программе командной строки Objective-C NSAutoreleasePool? - PullRequest
8 голосов
/ 08 июня 2011

Я изучаю 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, чтобы посмотреть, смогу ли я просто очистить память вручную без использования пула, но получил ту же проблему.

1 Ответ

9 голосов
/ 08 июня 2011

Да и да.

Какао (в графическом интерфейсе или в форме основания) ожидает наличия пула авто-выпуска;внутренняя часть фреймворка (а не только ваш собственный код) широко использует сообщение -autorelease и пулы, и если у вас нет пулов в стеке пулов с автоматическим выпуском, он будет жаловаться и пропускать объекты,как вы видели.

Полагаю, у вас отключена сборка мусора;Я никогда не разрабатывал его, но в этом случае я мог предположить, что вам это не понадобится.

Обновление Пулы с автоматическим выпуском теперь можно создавать с помощью блока @autoreleasepool {...}, которыйимеет тот же эффект, и некоторые приятные бонусы, такие как возможность просто прыгнуть / вернуться из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...