gpt4 book ai didi

objective-c - 哪个更好- [obj propName] 或 [obj valueForKey : @"propName"] when using an id pointer?

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:40 24 4
gpt4 key购买 nike

我有一些代码将一个对象分配给一个通用 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 不被认为更合适。执行此操作的理想方法是在知道对象是什么后将其转换为类类型。你也在错误地测试类(class)。您应该改用 -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;
}

关于objective-c - 哪个更好- [obj propName] 或 [obj valueForKey : @"propName"] when using an id pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com