Пожалуйста, объясните мне об этой утечке
У меня есть следующее сообщение об ошибке в моем журнале:
2011-10-13 10:41:44.504 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4e0ef40 of class CABasicAnimation autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.505 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b03700 of class NSConcreteValue autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.506 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b04840 of class __NSCFDictionary autoreleased with no pool in place - just leaking
Сообщение об ошибке появляется, когда я запускаю следующий код.
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];
Любое понимание? Спасибо за вашу доброту
1 ответ
Это происходит потому, что вы используете автоматически выпущенные объекты, когда нет пула автоматического выпуска. Вы можете прочитать больше о NSAutoreleasePool здесь.
В своем развитии какао вы могли видеть такие выражения:
@"string text"
[NSMutableArray arrayWithCapacity: 42]
[someObject autorelease]
Все они используют пул 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];