1

这是一个关于 Cocoa 良好编程技术的问题。
当你想在你的类的一个属性上调用一个方法时,你应该使用 KVC 来获取接收者还是只输入你的属性的名称?

例如,KVC:

[[self property] myMethod];

示例,简单:

[property myMethod];

谢谢!

4

2 回答 2

2

例如,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 进程的一部分并因此将其编写为可以安全使用时这种情况。)

于 2010-07-25T00:14:01.757 回答
0

我相信正式版本在技术上是正确的,因为这将保证来自时髦吸气剂的任何副作用。(为确保,制作一个自定义的 getterNSLog("in getter!")并让我们知道它是否有效。)

对于设置,您必须使用[self setProperty:foo];asproperty = foo绕过设置器,并可能导致内存泄漏。

如果您觉得它更自然,点符号(例如,self.propertyand self.property = foo)与[self property]and相同[self setProperty:foo]

于 2010-07-24T23:42:18.853 回答