【问题标题】:KVC compliant setter ?符合 KVC 的设置器?
【发布时间】:2014-01-21 17:17:08
【问题描述】:

我需要自己定义 getter 的行为,而不是合成我的 getter/setter。

执行此操作时,我收到一条警告,告诉我我还需要定义 setter,但我担心这样做是否符合 KVC:

- (void) setPath:(NSString *)path {
    _path = path;
}

或者我需要使用setValue:ForKey: 吗?

【问题讨论】:

  • @Rob,看看我的回答。如果您使用atomic 声明@property(或省略原子性说明符,因为atomic 是默认值),如果您尝试仅手动实现其中一种访问器方法,编译器会报错。
  • 你有一个很好的答案,但要澄清一下:访问器不需要符合 KVC。 属性需要通过具有遵循正确命名约定的访问器来兼容 KVC。对于名为“路径”的属性,-setPath: 是一个合规名称。该方法的作用无关紧要,因为 KVC 不知道也不关心您如何实现该属性。
  • 感谢您完成安德鲁斯的回答。我是 KVO/KVC 的新手,所以一切都不是很清楚。

标签: objective-c accessor key-value-coding


【解决方案1】:

是的,您发布的 setter 符合 KVC/KVO。

也就是说,为什么必须同时定义两者?是不是因为@property 声明指定了atomic?假设是这种情况,您应该切换到非原子。您可以使自己的访问器成为原子访问器,但这是大量的额外工作,而且除非您有充分且易于理解的理由来使用 atomic 属性,否则您可能不需要这样做。

【讨论】:

  • 意料之中,我实际上并没有定义非原子,感谢您的双重回答。
【解决方案2】:

如果您只想覆盖 getter,您仍然可以(并且应该)使用@synthesize 让编译器为您自动合成。这将合成您未覆盖的方法(在您的情况下为 setter)。

您的 setter 符合 KVC;这只是不必要的。

【讨论】:

  • 在这种情况下使用@synthesize 可能被认为是一种很好的风格,但实际上并没有必要。即使您手动实现了 getter,编译器仍会自动合成 setter(反之亦然)。仅当您同时实现自动综合时才会禁用。在这种情况下,您可以使用显式 @synthesize 来说服编译器合成实例变量。
  • 对不起;这里的旧思想(从自动合成之前)。是的,正如安德鲁所说;这里没有理由直接使用 synthesize。你可以让编译器为你做这件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多