2013-02-22 68 views
3

哪种方式更适合用于键值编码?让我们假设myController的类具有可变MYVARIABLE。有人可以写出不好的意见,这是不好的,为什么。KVC使用哪种方法?

// Method in the MyController class. 
- (NSString*)myVariableKVC { 
    return NSStringFromSelector(@selector(myVariable)); 
} 

[myController addObserver:self 
       forKeyPath:[myController myVariableKVC] 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

2.

[myController addObserver:self 
       forKeyPath:@"myVariable" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

从我的观点第一部分的一点是越多越好。我们没有硬编码的字符串,当我们将使用重构 - >重命名...重命名时,它将被重命名。

回答

3

如果您有一个名为-Wundeclared-selector(Xcode名称:“Undeclared Selector”,Xcode构建设置:GCC_WARN_UNDECLARED_SELECTOR)启用,如果您更改选择器的名称(第一种方法会给你一些来自编译器的警告这在任何地方都没有被声明为选择器),正如你所指出的那样,这会略微减少硬编码/“魔术”字符串。我不会理会有它独立的方法,虽然,我只是这样做:

[myController addObserver:self 
       forKeyPath:NSStringFromSelector(@selector(myVariable)) 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

此警告在默认情况下,我看着Xcode项目模板,所以如果你想这个检查,您需要手动打开项目的警告。

在没有该警告的情况下,没有区别,除了第一个方法引发另一个函数调用(并且在ObjC方法返回选择器(如问题中所示)的情况下发送ObjC消息)。我觉得这个警告以前是默认开启的,但事实上,我猜想。

+0

这实际上是不正确的。如果选择器名称中存在拼写错误,编译器将不会产生警告。它最终与使用硬编码的魔术字符串没有区别。 – Darren 2013-02-22 12:28:43

+0

哦,嘿,你是对的。我觉得它过去常常会给出“未知的选择器”警告..​​....也许我很困惑。好吧。为后人编辑。 – ipmcc 2013-02-22 12:32:31

+0

如果您有严格的编译器警告(您应该),如果该选择器不存在任何地方,您将会收到错误。 – 2013-02-22 12:37:08