这是一个关于 Cocoa 良好编程技术的问题。
当你想在你的类的一个属性上调用一个方法时,你应该使用 KVC 来获取接收者还是只输入你的属性的名称?
例如,KVC:
[[self property] myMethod];
示例,简单:
[property myMethod];
谢谢!
这是一个关于 Cocoa 良好编程技术的问题。
当你想在你的类的一个属性上调用一个方法时,你应该使用 KVC 来获取接收者还是只输入你的属性的名称?
例如,KVC:
[[self property] myMethod];
示例,简单:
[property myMethod];
谢谢!
例如,KVC:
[[self property] myMethod];
那不是KVC。KVC方式是:
[[self valueForKey:@"myProperty"] myMethod]
当您在编译时知道该属性时,没有理由这样做;您可以直接询问属性值或 ivar 值。由于 KVO 和(在 Mac 上)Bindings 已经实现,没有太多理由直接使用 KVC,因为 KVO 和 Bindings 为您使用它。
示例,简单:
[property myMethod];
那不访问该属性;它访问 ivar。
self
只有当您向属性的持有者(在您的示例中)发送访问者消息时,您才可以访问该属性。[self property]
使用or并不重要self.property
,因为它们是等价的;任何一个都是给 的property
消息self
,无论这意味着什么副作用。
这是关键的区别:点击访问器可能会导致副作用,而直接访问 ivar 永远不会。
因此,最佳实践:在所有实例方法中使用该属性(因为您可能想要访问器的副作用),除了在init
方法和dealloc
中,副作用将是一件坏事。(作为一般规则,您不应将消息发送到半初始化或半解除锁定的对象。例外情况是当您明确将该方法注释为您的 init/dealloc 进程的一部分并因此将其编写为可以安全使用时这种情况。)
我相信正式版本在技术上是正确的,因为这将保证来自时髦吸气剂的任何副作用。(为确保,制作一个自定义的 getterNSLog("in getter!")
并让我们知道它是否有效。)
对于设置,您必须使用[self setProperty:foo];
asproperty = foo
绕过设置器,并可能导致内存泄漏。
如果您觉得它更自然,点符号(例如,self.property
and self.property = foo
)与[self property]
and相同[self setProperty:foo]
。