2012-01-26 4 views
2

Я читаю документацию, в которой говорится, что setValue:forKey: будет обрабатывать значение NULL, как если бы оно было удалено. Тем не менее, у меня есть пример, такие как следующие, которые последовательно разбивая:Кодирование ключевых значений - setValue: forKey: где значение NULL

[myObj setValue:[aDictionary valueForKey:@"keyDoesNotExist"] forKey:@"anotherKey"];

Эта строка кода аварии, если aDictionary не содержит ключа keyDoesNotExist. Есть ли способ обойти это? Какая уместная вещь здесь?

myObj - это пример NSManagedObject. «anotherKey» - это отношение «один ко многим», в котором myObj может содержать много «anotherKey».

ответ

6

Когда вы вызываете setValue:forKey: с нулевым значением, вызывается метод -setNilValueForKey:. По умолчанию (в реализации NSObject) это приводит к исключению недопустимого аргумента. Вы можете сделать что-то еще с нулевым значением, переопределив -setNilValueForKey: и сделав все, что захотите.

В качестве альтернативы, если вы звоните другойКлюч сеттер myObj напрямую, вы не должны получить исключение (в зависимости от реализации setAnotherKey: конечно):

myObj.anotherKey = [aDictionary valueForKey:@"keyDoesNotExist"]; 

Документация вы читаете это, вероятно, для NSMutableDictionary. Выполнение NSMutableDictionary setValue:forKey: вызывает removeObjectForKey:, если значение равно nil. Это неверно для подклассов NSObject, которые, как я полагаю, является myObj.

Это поведение обсуждается в NSKeyValueCoding Protocol Reference documentation.

+0

Спасибо за объяснение. даже когда я пошел вперед и определил setNilValueForKey :, я получаю EXEC_BAD_ACCESS. aDictionary определенно существует, и в нем есть другие ключи, но не ключ keyDoesNotExist. – randombits

+1

В моем ответе не учитывался тот факт, что myObjc является объектом NSManagedObject, поскольку вы еще не добавили его на свой вопрос. Тем не менее, EXC_BAD_ACCESS указывает на ошибку управления памятью, вероятно, из-за того, что вы отправляете сообщение (вызывающее метод) на объект, который был освобожден. Другими словами, это, вероятно, проблема управления памятью, а не проблема с вызовом 'setValue: ForKey:' с нулевым значением. Не видя больше своего кода, его невозможно диагностировать. Попробуйте запустить вашу программу с помощью инструмента «Инструмент зомби». –

+0

Вы должны добавить NSZombieEnabled со значением YES в качестве переменной среды вашего исполняемого файла. Затем повторно запустите свой код. Если это зомби, вы получите сообщение об ошибке в консоли, например сообщение «- [MyClass methodName]», отправленное на освобожденный экземпляр ». – Roberto

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