请考虑以下代码:
if([obj isKindOfClass:[NSString class]]) {
NSString *s = [(NSString *)obj stringByAppendingString:@"xyzzy"];
}
我在这里有点困惑。 if
语句检查obj
是否属于NSString
类。如果是,它会将对象和附加字符串分配给NSString *s
,我是否正确理解了这一点?如果是这样,为什么还要把它投到(NSString *)
?
if
语句是否已经检查过,并且不会使类型转换不必要?
只是说:
,这不是完全可以的 NSString *s = obj stringByAppendingString:@"xyzzy"];
提前致谢。
答案 0 :(得分:3)
这完全取决于obj
的定义方式。如果是id obj
则不需要强制转换,但如果它被定义为NSObject *obj
,那么必须使用强制转换 来禁止编译器警告stringByAppendingString:
未定义在NSObject
。不需要强制转换使代码在运行时工作,它只告诉编译器“正确”类型,以便它可以判断方法是否应存在于对象上。
id
不需要强制转换的原因是id
表示“任何类型的对象”,而NSObject *
表示“NSObject类型的对象”。