Я пытаюсь отладить очень гнусную проблему с некоторым кодом iPhone Core Data.
Настройка такова: у меня есть поток, который существует для опроса веб-сервиса и отправки его результатов через NSNotification
в основной поток (переданный в userDict
, связке строк и NSNumber
с). Я использую библиотеку уведомлений Тима Хэтчера , чтобы перейти к основному потоку.
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
Основной поток получает userDict, затем продолжает извлекать его значения и вставляет их в новый управляемый объект. Пока все хорошо.
Однако у меня возникают проблемы с этим, но не сразу. После того, как поток опубликовал свои результаты в главном потоке и сохранил новый объект в контексте, я могу выполнить определенную серию операций (включая NSFetchRequest
и пару назначений отношений), что приводит к EXC_BAD_ACCESS
при попытке получить доступ к одному из свойств извлеченного управляемого объекта.
Другая забавная вещь в том, что я могу решить проблему. Я могу сделать это, поместив один [userDict retain]
в поток перед тем, как поместить его внутрь NSNotification
, который будет отправлен в основной поток для сохранения в управляемом объекте. Не имеет значения, если я защищаю объекты друг от друга, создавая новый NSString
, как только я получу значения в принимающем потоке, он все равно потерпит крах без этого retain
.
NSDictionary* userDict = [Message userDictFromXML:el];
if (userDict != nil)
{
[userDict retain]; // NOW THIS WORKS (???)
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"InsertMessage" object:nil userInfo:userDict];
}
Что дает ???