目标 c - 使用 id 指针时,哪个更好 - [obj propName] 或 [obj valueForKey:@ "propName" ] 更好?



我有一些代码,它将对象分配给一个通用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示例?

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

最新更新