__NSAutoreleaseNoPool (): объект 0x753c2f0 класса General автоматически выпущен без пула на месте - просто утечка - PullRequest
5 голосов
/ 30 ноября 2010

Я некоторое время не замечал вывод своей консоли и неожиданно заметил много странных ошибок.

__NSAutoreleaseNoPool(): Object 0x753c2f0 of class General autoreleased with no pool in place - just leaking

__NSAutoreleaseNoPool(): Object 0x753c300 of class __NSArrayM autoreleased with no pool in place - just leaking

Понятия не имею, где это происходит?

Редактировать ..

Я использую это

[self performSelectorInBackground:@selector(startupStuff) withObject:sender];

С statupStuff У меня есть

General *rdb = [[General alloc] autorelease];
[rdb refreshDBData];

Ошибки появляются вскоре после кода в методе refreshDBData.

Ответы [ 3 ]

16 голосов
/ 30 ноября 2010

Автозапуск пулов привязан к потокам. Если вы создаете поток с помощью executeSelectorInBackground, вам нужно создать и уничтожить пул авто-релиза для себя. Так что вам нужно, чтобы startupStuff выглядел так:

- (void)startupStuff:(id)sender
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // ... everything else you were doing ...

    [pool drain]; //see comment below
}

Дополнение: Ричард ниже указывает, что сток предпочтительнее выпуска, чтобы признать, что (на рабочем столе, но еще не на iOS) вы можете работать с сборщиком мусора. Определенные слова Apple ( источник ):

В среде сбора мусора отправка сообщения «сток» в пул запускает сборку мусора при необходимости; релиз, однако, не является опцией. В среде с подсчетом ссылок утечка имеет тот же эффект, что и выпуск. Поэтому, как правило, вместо выпуска следует использовать сток.

Итак, я исправил свой пример. Достаточно сказать, что этот конкретный вопрос касается iPhone, и в настоящее время на этом устройстве нет сборки мусора. Таким образом, исходный плакат находится в лагере «сток имеет тот же эффект, что и выпуск», а не «сток ...» запускает сборку мусора, если это необходимо; релиз, однако, является лагерем запретного действия.

4 голосов
/ 30 ноября 2010

Это:

General *rdb = [[General alloc] autorelease];

Неверно.Всегда должен быть вызов инициализатора;до -init, как минимум.

0 голосов
/ 30 ноября 2010

Попробуйте это

[self performSelectorInBackground:@selector(startupStuff) withObject:sender];

-(void)startupStuff:(id)sender
{

   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

   General *rdb = [[General alloc] init];

   [rdb refreshDBData];

   [rdb release];

   [pool release];

}

Если он тоже не работает, вам нужно проверить метод refreshDBData .. вы делаете что-то не так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...