Какао использует авто-релизные пулы . Пул авто-выпуска сохраняет ссылки на объекты, которые были автоматически освобождены, и, когда пул очищается, он отправляет сообщение -release
этим автоматически выпущенным объектам.
В подавляющем большинстве случаев в приложениях Какао должен быть хотя бы один пул авто-выпусков, поскольку в Какао интенсивно используются объекты с автоматическим выпуском. При запуске приложения Какао, Какао автоматически создает пулы автоматического выпуска для приложения.
В вашем случае кажется, что ваше приложение является программой Foundation, а не полноценным приложением Cocoa. Таким образом, вы несете ответственность за настройку пула автоматического выпуска для своей программы. Например,
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Photo *obj = [[Photo alloc] init];
// …
[pool drain];
return 0;
}
Обратите внимание, что пул авто-релиза не является строго обязательным. Если нет пула автоматического выпуска, ваша программа выдаст это предупреждение, и, в зависимости от особенностей вашей программы, вы можете пропустить объекты. Поскольку утечка памяти - это плохая функция в программе, особенно в программах с длительным сроком службы или программах, которые выделяют много памяти, рекомендуется всегда устанавливать пул автоматического выпуска.
Тем не менее, вы сами не отправили -autorelease
в этот фрагмент кода, так почему же существует строка с автоматическим выпуском? Я предполагаю, что вы синтезировали свойство caption
, и компилятор создал метод доступа, который возвращает автоматически выпущенную строку, содержащую подпись к фотографии. Когда вы отправляете [obj caption]
, вы получаете автоматически освобожденную строку и, следовательно, предупреждение, поскольку вы не настроили пул автоматического выпуска.