我应该只是投射一个变量,还是使用isKindOfClass:
来检查它然后再投射?哪一个会更好,更有效? (好吧,效率不仅仅是一个问题。)我希望下面的string
为NSString
。
示例:
NSString *string = (NSString *)result;
或:
if(![string isKindOfClass:[NSString class]]
{
//cast it
}
答案 0 :(得分:5)
Casting没有任何运行时效果。这只是给编译器的一个信息,你确定从一种类型分配到另一种类型是可以的(当你有id
时,它也会使有关“可能没有响应”的警告静音。) p>
NSString * s = (NSString *)[NSNumber numberWithInt:0];
// The compiler will let you do this, but it's pointless, because:
[s floatValue]; // Okay; NSNumber also implements -floatValue
[s lowercaseString]; // Crashes; s is still an NSNumber instance,
// which doesn't respond to -lowercaseString
另一方面,isKindOfClass:
在编译时没有任何影响;它就像任何其他消息一样在运行时发送,然后确定其结果。
我不确定你想要实现什么,但我想不出通过组合这两种机制可以做的任何有用的事情。
没有理由在投射前发送isKindOfClass:
,但不是出于您的想法。要么你在编译时知道这个类,在这种情况下isKindOfClass:
是没有意义的,要么你没有,在这种情况下,转换是无效的。
答案 1 :(得分:3)
虽然只是投射会更有效率,但如果您首先检查结果是否符合您的预期,那么您的应用可能会更好。
这一切都取决于你想要的安全性