3

哪种方式更适合用于键值编码?让我们假设MyController类有变量myVariable。有人能写出好与坏的意见,以及为什么。

1.

// 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];

从我的角度来看,第一部分更好。我们没有硬编码的字符串,当我们使用Refactor -> Rename...进行重命名时,它将被重命名。

4

1 回答 1

3

如果您启用了一个名为-Wundeclared-selector(Xcode name: "Undeclared Selector", Xcode build setting: GCC_WARN_UNDECLARED_SELECTOR) 的警告,如果您更改选择器的名称(更改为未在任何地方声明的名称),第一种方法会给您来自编译器的警告作为选择器),正如您所指出的,这会略微减少硬编码/“魔术”字符串。不过,我不会为它使用单独的方法,我只是这样做:

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

在我查看的 Xcode 项目模板中,默认情况下此警告打开,因此如果您想要此检查,您需要为您的项目手动打开该警告。

如果没有该警告,则没有区别,除了第一个方法会引发另一个函数调用(如果 ObjC 方法返回问题中出现的选择器,则发送 ObjC 消息)。我觉得这个警告过去是默认开启的,但我猜情况会发生变化。

于 2013-02-22T12:08:18.813 回答