Сетобъект NSMutableDictionary с ошибкой «сообщение отправлено освобожденному экземпляру» - PullRequest
1 голос
/ 18 декабря 2009

Эта строка кода: [mymutabledict setObject:myclassobj forKey:myclassobj.myidstring];

выдаёт эту ошибку:

*** - [NSCFString hash]: сообщение отправлено освобожденному экземпляру 0x3c14610

Я поставил точку останова в этой строке, и я проверил, и все 3 объекта (mymutabledict, myclassobj и myclassobj.myidstring) правильно размещены и видимы и правильно отображаются в отладчике. Что еще может быть причиной этой ошибки? Может ли это быть что-то, связанное с объектом или ключами, которые я использовал для помещения предыдущих элементов в словарь?

Я даже проверил, и используемый ключ не соответствует ни одному из ранее введенных ключей.

Для дополнительной информации: я загружаю объекты из базы данных SQL в изменяемый словарь в памяти. Этот код отлично работал в течение нескольких недель с несколькими наборами образцов данных, и только сегодня появилась одна конкретная копия БД. Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 декабря 2009

Вы, кажется, звоните release слишком много раз о чем-то. Добавьте следующий код чуть выше этой строки:

for (NSString *key in mymutabledict) {
    NSLog(@"Key %@ maps to %@.", key, [mymutabledict objectForKey:key]);
}
NSLog(@"About to add %@", myclassobj);
NSLog(@"   with key %@", myclassobj.myname);

... и найдите сбойный объект.

Ключи копируются, а не сохраняются, когда объекты добавляются в объект NSDictionary / NSMutableDicitonary. Если вы извлекаете ключи из словаря и отпускаете их (например, вызываете [key release] в приведенном выше коде или для строковых объектов, полученных с помощью [mymutabledict allKeys]), это может сделать это.

1 голос
/ 18 декабря 2009

Как вы определяете свойство "myidstring"? Поскольку это NSString, вы объявили его как "@property (retain)", чтобы сохранить его ссылку действительной.

1 голос
/ 18 декабря 2009

Запустите вашу программу с помощью NSZombieEnabled . NSZombieEnabled меняет тип объекта (в вашем случае NSMutableDictionary) на объект NSZombie, когда счет сохранения достигает 0. Когда программа отправляет сообщение этому объекту-зомби, программа немедленно завершает работу, позволяя вам точно определить, где происходит проблема. .

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