键值编码 - setValue:forKey:其中value为NULL

时间:2012-01-26 04:31:44

标签: iphone objective-c key-value-coding

我正在阅读的文档说setValue:forKey:会将NULL值视为已被删除。然而,我有一个例如以下的例子一直在崩溃:

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

如果aDictionary不包含密钥keyDoesNotExist,则此行代码会崩溃。那有什么办法吗?在这里做什么是合适的?

myObj是NSManagedObject的一个实例。 “anotherKey”是一对多的关系,myObj可以包含许多“anotherKey”。

1 个答案:

答案 0 :(得分:6)

当您使用nil值调用setValue:forKey:时,将调用方法-setNilValueForKey:。默认情况下(在NSObject的实现中),这会引发无效的参数异常。您可以通过覆盖-setNilValueForKey:并执行您喜欢的任何操作来使用零值执行其他操作。

或者,如果直接调用myObj的anotherKey setter,则不应该得到异常(当然,取决于setAnotherKey:的实现):

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

您正在阅读的文档可能是NSMutableDictionary。如果值为nil,NSMutableDictionary的setValue:forKey:调用removeObjectForKey:的实现。对于NSObject子类来说,情况并非如此,我认为它是myObj。

NSKeyValueCoding Protocol Reference documentation中讨论了此行为。