Основные данные + NSOperationQueue - PullRequest
1 голос
/ 10 октября 2011

У меня есть подкласс NSOperation, который управляет объектом как одним из его свойств.Мне нужно добавить несколько операций в nsoperationqueue и наблюдать за их завершением.Для каждого экземпляра NSOperation я создал новый управляемый объект в виде состояния документации Apple «Создайте отдельный контекст управляемого объекта для каждого потока и предоставьте общий координатор постоянного хранилища».Как только первая операция завершена, я получаю следующий журнал сбоев

#0  0x34970c98 in objc_msgSend ()
#1  0x3608704e in -[_PFArray dealloc] ()
#2  0x36084b80 in -[_PFArray release] ()
#3  0x3179b1a0 in CFRelease ()
#4  0x3179deba in _CFAutoreleasePoolPop ()
#5  0x30d7bbb4 in NSPopAutoreleasePool ()
#6  0x30d91e1c in -[__NSOperationInternal start] ()
#7  0x30d91a7e in -[NSOperation start] ()
#8  0x30df7eca in ____startOperations_block_invoke_2 ()
#9  0x33a248e6 in _dispatch_call_block_and_release ()
#10 0x33a1a532 in _dispatch_worker_thread2 ()
#11 0x368bf590 in _pthread_wqthread ()
#12 0x368bfbc4 in start_wqthread ()

Из журналов кажется, что какой-то объект становится перепродаваемым. Как я могу получить, какой объект перевыпущен?Приложение запускается с NSZombieEnabled, но только выше информации получено.поддерживает ли NsOperation собственный пул автоматического выпуска?

1 Ответ

0 голосов
/ 10 октября 2011

Вот ваши подсказки:

#7  0x30d91a7e in -[NSOperation start] ()

Это то, что вы выпускаете в своей работе.

#5  0x30d7bbb4 in NSPopAutoreleasePool ()

Это объект, который автоматически высвобождается.Это не обязательно означает, что вы написали вызов метода autorelease.Объекты, созданные вспомогательными методами, такими как [NSString stringWithFormat: ...], автоматически высвобождаются перед их возвратом.Поэтому найдите в своем коде операции место, где вы вызываете autorelease, или место, где вы создаете объект без шаблона alloc-init.

Да, NSOperation поддерживает свой собственный пул autorelease.Вам не нужно беспокоиться об этом.Если вы освобождаете объекты только тогда, когда с ними покончено, и только автоматически освобождаете объекты, когда вы закончите с ними к концу области действия метода (или вызываете область метода, если возвращаете их), все будет в порядке.

#2  0x36084b80 in -[_PFArray release] ()

Это объект, хранящийся в массиве (а не в самом массиве), который перевыпускается.

Ошибка такого типа означает, что вы либо освобождаете, либо автоматически высвобождаете объект, когда не должны, или выне сохраняют объект, когда вы должны.Это может быть либо неверный выпуск, либо неверный авто-выпуск, даже если ошибка возникает в пуле авто-релизов.Авто-релиз может быть правильным, а выпуск может быть неправильным.В любом случае ошибка будет возникать при сливе пула автоматического выпуска, потому что это произойдет позже.

...