使用id指针时哪个更好 - [obj propName]或[obj valueForKey:@“propName”]?

时间:2011-06-28 23:22:41

标签: objective-c key-value-coding

我有一些代码将一个对象分配给一个通用的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的代码片段 - 为什么使用点语法会导致编译错误?这本质上只是向getter访问器发送一条消息,类似于MyClass1示例吗?

1 个答案:

答案 0 :(得分:3)

不,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;
}