Пожалуйста, объясните мне об этой утечке - PullRequest
0 голосов
/ 13 октября 2011

В моем журнале появляется следующее сообщение об ошибке:

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 Ответ

1 голос
/ 13 октября 2011

Это происходит потому, что вы используете автоматически выпущенные объекты, когда нет пула автоматического выпуска. Вы можете прочитать больше о 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...