Это происходит потому, что вы используете автоматически выпущенные объекты, когда нет пула автоматического выпуска. Вы можете прочитать больше о NSAutoreleasePool здесь .
В своем развитии какао вы могли видеть такие выражения:
@"string text"
[NSMutableArray arrayWithCapacity: 42]
[someObject autorelease]
Все они используют пул авто-релиза. В первых двух случаях вам отправляется сообщение autorelease
. В последнем случае мы отправляем его объекту явно. Сообщение autorelease
гласит: «Уменьшить счетчик ссылок при сливе ближайшего пула автоматического выпуска». Вот пример:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *myObject = [[NSObject alloc] init]; // some object
[myObject autorelease]; // send autorelease message
[pool release]; // myArray is released here!
Как вы можете себе представить, возможны утечки памяти, если вы autorelease
объект, ожидающий, что пул освободит его позже. Какао обнаруживает это и выдает ошибку, которую вы опубликовали выше.
Как правило, в программировании Какао, NSAutoreleasePool
всегда доступен. Цикл выполнения NSApplication
истощает его на каждой итерации. Однако, если вы выполняете работу вне основного потока (т. Е. Если вы создали свой собственный поток) или если вы выполняете работу до вызова NSApplicationMain
или [NSApp run]
, пул автоматического выпуска не будет создан. Обычно это можно исправить, добавив один:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];
[pool release];