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

我的代码中有这些行:

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

但是阅读 Apple 参考文档:

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

【问题讨论】:

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


    【解决方案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 兼容属性(因此是“任意键”)。如果您在其他对象上尝试此操作,可能会引发异常。我承认我不确定如何轻松找出其他类是否有这种行为,在许多其他地方免费提供这种行为肯定会很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多