2010-01-27 1 views
0

Я пытаюсь отладить очень гнусную проблему с некоторым кодом кода ядра iPhone.Основные данные: Как сохранить без сохранения?

Установка заключается в следующем: У меня есть поток, который существует для опроса веб-службы и отправлять свои результаты с помощью NSNotification в основной поток (принят в userDict, кучу строк и NSNumber с). Я использую Tim Hatcher's notification library, чтобы перейти к основной теме.

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]; 
} 

Что дает ???

+0

Уведомления действуют в той же теме, с которой они отправляются, и не пересекают границы резьбы. Учитывая это, вы уверены, что остальная часть вашего кода действительна? – zneak

+0

Забыл пояснить, я использую библиотеку (см. Выше правки), чтобы пройти через границы потоков. Я проверил saveCounts объектов, о которых идет речь, и все кажется ОК. – sehugg

+0

Можете ли вы показать код для своих свойств и когда вы добавляете объекты в ManagedObject? –

ответ

2

Итак, проблема в том, что объекты находятся в управляемом объекте, не так ли? Причина, по которой фиксированные вещи фиксируются, заключается в том, что этот словарь никогда не освобождается, это означает, что все, что еще перевыпускает ваш объект, может сделать это без сбоев, и в конце концов у вас есть словарь с плохим указателем в нем (поскольку ваш объект был выпущен).

Если у вас есть Snow Leopard, попробуйте запустить NSZombieEnabled и используйте инструмент инструментов ObjectAlloc. Когда зомби освобождается, вы можете щелкнуть и найти список всех мест, где объект был сохранен и выпущен.

+0

ARGHH! Единственным [удержанием] был преступник. Отныне все является (сохраняющим) свойством:^P Спасибо, что подталкивали меня в правильном направлении.Я знал, что у Инструментов было что-то полезное, я просто не понимал, как далеко по кроличьей лунке это тебя достало. – sehugg

0

Мне кажется, что вам нужно сохранить объекты, добавив их в ManagedObject из Dict. Я подозреваю, что добавление сохранения до того, как вы отправите его через уведомление, будет сохранено, но вам не хватает удержания на другой стороне, чтобы он балансировал.

+0

Не нужно, у меня есть «сохранить», указанный во всех свойствах моего управляемого объекта (с использованием стандартного сгенерированного класса, ничего необычного) – sehugg

+0

Ах хорошо. Тогда я не уверен. Может быть, пропущенный удержался где-то еще раньше? –

 Смежные вопросы

  • Нет связанных вопросов^_^