Что лучше - [obj propName] или [obj valueForKey: @ "propName"] при использовании указателя идентификатора? - PullRequest
3 голосов
/ 29 июня 2011

У меня есть некоторый код, который назначает объект общей переменной id, а затем выполняет различные действия в зависимости от класса, к которому принадлежит указанный объект (предположим, что каждый класс имеет соответствующее свойство, определенное и реализованное правильно):

id obj = #<this could be one of several things>#
id result;
if ([obj class] == [MyClass1 class])
{
    result = [obj myProp1];
}
else if ([obj class] == [MyClass2 class])
{
    result = [obj valueForKey:@"myProp2"];
}
else if ([obj class] == [MyClass3 class])
{
    result = obj.myProp3; // this doesn't compile!
}
else
{
    result = nil;
}

Что касается фрагментов MyClass1 и MyClass2, считается ли использование KVC более правильным или лучшим, чем просто отправка сообщения объекту напрямую в нединамических случаях (имя свойства является константой)?Использует ли метод KVC больше накладных расходов, поэтому его следует использовать только тогда, когда имя вызываемого свойства является динамическим?Я хотел бы получить представление о том, когда стоит использовать KVC.

Что касается фрагмента с MyClass3 - почему использование синтаксиса точки вызывает ошибку компиляции?Разве это не просто отправка получателю доступа сообщения, похожего на пример MyClass1?

1 Ответ

3 голосов
/ 29 июня 2011

Нет, KVC не считается более подходящим.Идеальный способ сделать это - привести ваш объект к типу класса, как только вы узнаете, что это такое.Вы также неправильно тестируете класс.Вы должны использовать -isKindOfClass: вместо этого.Ваш классовый тест сейчас примерно эквивалентен использованию -isMemberOfClass:.

id obj = getObj();
id result = nil;
if ([obj isKindOfClass:[MyClass1 class]]) {
    result = [(MyClass1 *)obj myProp1];
} else if ([obj isKindOfClass:[MyClass2 class]]) {
    result = [(MyClass2 *)obj myProp2];
} else if ([obj isKindOfClass:[MyClass3 class]]) {
    result = ((MyClass3 *)obj).myProp3;
}
...