iPhone - setValue:forkey: 未记录

Posted

技术标签:

【中文标题】iPhone - setValue:forkey: 未记录【英文标题】:iPhone - setValue:forkey: not documented 【发布时间】:2012-02-08 10:28:06 【问题描述】:

我的代码中有这些行:

[defaults setValue:someValue forKey:@"someValue"];
[animationGroup setValue:@"someValue" forKey:@"someValue"];  // CAAnimationGroup
NSString* animName = [theAnimation valueForKey:@"someValue"]; // CAAnimation

但是阅读 Apple 参考文档:

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html https://developer.apple.com/library/IOs/#documentation/GraphicsImaging/Reference/CAAnimationGroup_class/Introduction/Introduction.html https://developer.apple.com/library/IOs/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/cl/CAAnimation

我没有看到对这些方法的任何引用,即使是解析层次结构或符合的协议。他们从哪里来?是否允许使用它们?

【问题讨论】:

【参考方案1】:

这些是键值编码方法;如果这些类与这些键的键值编码兼容,那么您可以毫无问题地使用它们。关于 Core Animation,CALayerCAAnimation 都符合 KVC,详见this programming guide。如需更多一般信息,请参阅NSKeyValueCoding 非正式协议和Key-Value Coding Programming Guide。

【讨论】:

你知道为什么在这些类的“符合”部分没有引用 NSKeyValueCoding 协议吗? NSKeyValueCoding 是一个非正式协议,它被定义为NSObject 上的类别(参见NSKeyValueCoding.h 头文件),而不是显式协议,因为实现是可选的。【参考方案2】:

附带说明也让我感到困惑。上述链接之一提供:

CALayer 和 CAAnimation 都是符合键值编码的容器 类,允许您为任意键设置值。也就是说,虽然 键“someKey”不是 CALayer 类的声明属性, 但是您仍然可以为键“someKey”设置一个值

意味着您可以安全地发送类似 KVC 的 setValue:forKey: 和 valueForKey: 消息,而不必担心 @"someKey" 不是真正的 KVC 兼容属性(因此是“任意键”)。如果您在其他对象上尝试此操作,可能会引发异常。我承认我不确定如何轻松找出其他类是否有这种行为,在许多其他地方免费提供这种行为肯定会很有用。

【讨论】:

以上是关于iPhone - setValue:forkey: 未记录的主要内容,如果未能解决你的问题,请参考以下文章

setValue: forKey: 和 setValue: forKeyPath:

自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:

NSMutableArray 的 setValue:forKey: 和 setObject:forKey: 有啥区别?

CKRecord setValue:forKey 或 setObject:forKey

setObject:forKey和setValue:forKey的区别

具有 NSObject 继承的泛型类,self.setValue(, forKey:) 不起作用