Кодирование значения ключа - setValue: forKey: где значение равно NULL - PullRequest
2 голосов
/ 26 января 2012

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

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

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

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

1 Ответ

6 голосов
/ 26 января 2012

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

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

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

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

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

...