Кодирование значения ключа-setValue: forKey: где значение равно NULL


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

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

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

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

1 2

1 ответ:

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

Альтернативно, если вы вызываете myobj's anotherKey setter напрямую, вы не должны получить исключение (зависит от реализации setAnotherKey:, Конечно):

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

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

Это поведение обсуждается в справочной документации по протоколу NSKeyValueCoding .