Iphone 键值编码-设置值:forKey:其中值为NULL

Iphone 键值编码-设置值:forKey:其中值为NULL,iphone,objective-c,key-value-coding,Iphone,Objective C,Key Value Coding,我正在阅读的文档中说,setValue:forKey:会将NULL值视为被删除。然而,我有一个例子,比如下面的例子,它一直在崩溃: [myObj setValue:[aDictionary valueForKey:@“keydesnotexist”]forKey:@“anotherKey”] 如果aDictionary不包含键keydesnotexist,则此行代码将崩溃。有什么办法吗?在这里应该做什么 myObj是NSManagedObject的一个实例。“anotherKey”是一种一对多关

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

[myObj setValue:[aDictionary valueForKey:@“keydesnotexist”]forKey:@“anotherKey”]

如果
aDictionary
不包含键
keydesnotexist
,则此行代码将崩溃。有什么办法吗?在这里应该做什么


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

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

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

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


此行为将在中讨论。

感谢您的解释。即使我已经定义了setNilValueForKey:,我也得到了一个EXEC\u BAD\u访问权限。Dictionary确实存在,其中还有其他键,但没有keyDoesNotExist键。我的回答没有考虑到myObjc是一个NSManagedObject的事实,因为您还没有将它添加到您的问题中。也就是说,EXC_BAD_ACCESS表示内存管理错误,可能是因为您正在向已解除分配的对象发送消息(对其调用方法)。换句话说,这可能是内存管理问题,而不是使用nil值调用
setValue:ForKey:
的问题。如果看不到更多的代码,就不可能进行诊断。尝试使用Instruments的Zombies工具运行您的程序。您应该将NSZombieEnabled(值为YES)添加为可执行文件的环境变量。然后重新运行代码。如果它是一个僵尸,您将在控制台中收到一条错误消息,如“-[MyClass methodName]消息发送到deallocated实例。”我想指出的是,如果您不重写该方法,在NSManagedObject上调用“[self-setNilValueForKey:key];”实际上不会引发NSInvalidArgumentException。我不太明白为什么会这样。我的假设是,NSManagedObject重写此方法以为属性类型设置适当的nil值,但我找不到关于这一点的明确文档或指示。我相信在阅读完对话之后,问题和公认的答案现在已经混淆了。由于问题已修改,NSManagedObject上“引发无效参数异常”的答案不正确,因为“nil”是NSManagedObject上的有效条目,并且NSManagedObject不是“value”的“type”。这就是为什么它不会引发NSInvalidArgumentException。如果我错了,请纠正我?
myObj.anotherKey = [aDictionary valueForKey:@"keyDoesNotExist"];