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