2013-02-22 14 views
3

Какой способ лучше использовать для кодирования ключевых значений? Предположим, что MyController класс имеет переменную myVariable. Может ли кто-нибудь написать мнение, хорошее, что плохо и почему.Какой подход использовать для KVC?

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 ..., то он будет переименован.

ответ

3

Если у вас есть Варинг имя -Wundeclared-selector (имя Xcode: «Необъявленная Selector», установка Xcode сборки: GCC_WARN_UNDECLARED_SELECTOR) включен, первый способ даст вам некоторое предупреждение от компилятора, если вы измените имя селектора (к чему-то который не объявлен нигде как селектор), и, как вы отмечаете, это незначительно уменьшает жестко закодированные/«магические» строки. Я бы не стал заморачиваться, имеющий отдельный метод для этого, хотя, я просто делаю это:

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

Это предупреждение не по умолчанию в шаблонах Xcode проекта я смотрел, так что если вы хотите это проверить, вам нужно вручную включить это предупреждение для своего проекта.

Отсутствие этого предупреждения не имеет значения, за исключением того, что первый метод вызывает другой вызов функции (и сообщение ObjC посылает в случае наличия метода ObjC, который возвращает селектор, как появляется в вопросе). Я чувствую, что это предупреждение использовалось по умолчанию, но все меняется.

+0

Это действительно неверно. Компилятор не выдаст предупреждение, если в названии селектора есть опечатка. Он заканчивается тем, что не отличается от использования жестко заданной магической строки. – Darren

+0

О, эй, ты прав. Я чувствую, что он использовал, чтобы дать предупреждения «неизвестного селектора» ... может быть, я смущен. Ну что ж. Отредактировано для потомков. – ipmcc

+0

Если у вас есть строгие предупреждения о компиляторе (что вам нужно), вы получите сообщение об ошибке, если этот селектор не существует нигде. –

Смежные вопросы