在投射之前检查对象的类是否最好?

时间:2012-01-24 23:47:55

标签: objective-c cocoa casting

我应该只是投射一个变量,还是使用isKindOfClass:来检查它然后再投射?哪一个会更好,更有效? (好吧,效率不仅仅是一个问题。)我希望下面的stringNSString

示例:

NSString *string = (NSString *)result;

或:

if(![string isKindOfClass:[NSString class]]
{
   //cast it
} 

2 个答案:

答案 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)

虽然只是投射会更有效率,但如果您首先检查结果是否符合您的预期,那么您的应用可能会更好。

这一切都取决于你想要的安全性