NSAutoreleaseNoPool при выполнении NSLog - разработка приложений для Mac - PullRequest
0 голосов
/ 22 февраля 2011

Я пробую программу в Xcode, и я создал новое приложение Mac Cocoa.У меня есть класс Photo с двумя переменными экземпляра Caption, Photographer.В основной функции я задаю им значения следующим образом:

Photo *obj = [[Photo alloc]init];
obj.caption=@"Something";
obj.photographer=@"Hari";
NSLog(@"Name: '%@'",[obj caption]);
[obj release];

Я получаю вывод с именем Name: 'Something', но вместе с этим я получаю эту строку

2011-02-22 11:56:03 test_1[1402:a0f] * __NSAutoreleaseNoPool(): Object 0x100002078 of class NSCFString autoreleased with no pool in place - just leaking

Может кто-нибудь объяснить, почему эта строка появляется в консоли?

Спасибо,

Харихаран

1 Ответ

0 голосов
/ 22 февраля 2011

Какао использует авто-релизные пулы . Пул авто-выпуска сохраняет ссылки на объекты, которые были автоматически освобождены, и, когда пул очищается, он отправляет сообщение -release этим автоматически выпущенным объектам.

В подавляющем большинстве случаев в приложениях Какао должен быть хотя бы один пул авто-выпусков, поскольку в Какао интенсивно используются объекты с автоматическим выпуском. При запуске приложения Какао, Какао автоматически создает пулы автоматического выпуска для приложения.

В вашем случае кажется, что ваше приложение является программой Foundation, а не полноценным приложением Cocoa. Таким образом, вы несете ответственность за настройку пула автоматического выпуска для своей программы. Например,

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Photo *obj = [[Photo alloc] init];
    // …

    [pool drain];
    return 0;
}

Обратите внимание, что пул авто-релиза не является строго обязательным. Если нет пула автоматического выпуска, ваша программа выдаст это предупреждение, и, в зависимости от особенностей вашей программы, вы можете пропустить объекты. Поскольку утечка памяти - это плохая функция в программе, особенно в программах с длительным сроком службы или программах, которые выделяют много памяти, рекомендуется всегда устанавливать пул автоматического выпуска.

Тем не менее, вы сами не отправили -autorelease в этот фрагмент кода, так почему же существует строка с автоматическим выпуском? Я предполагаю, что вы синтезировали свойство caption, и компилятор создал метод доступа, который возвращает автоматически выпущенную строку, содержащую подпись к фотографии. Когда вы отправляете [obj caption], вы получаете автоматически освобожденную строку и, следовательно, предупреждение, поскольку вы не настроили пул автоматического выпуска.

...