在Objective-C中,哪种代码更好?
//版本#1
id obj<MyProtocol>;
[obj myMessage];
//版本#2
id obj;
if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
[obj myMessage];
出于某种原因,我在示例代码中看到了第一版,但对我来说版本2似乎更安全。 如果obj是从运行时不符合协议MyProtocol的通用ID分配的,会发生什么?
答案 0 :(得分:9)
答案 1 :(得分:1)
同时执行:
id<MyProtocol> obj;
if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
{
[obj myMessage];
}
第一个是变量类型,告诉编译器你打算用变量做什么,但不能保证变量实际上能保存你想要的东西;第二个是一致性检查,测试变量实际上是否符合您的要求。
答案 2 :(得分:1)
由于objective-c在运行时绑定而不是类型保存,请同时执行。正确的声明可以防止在编译时检测到的所有错误。出于好的理由,大多数只是警告。运行时检查可防止应用程序在您没有获得您希望处理的引用的情况下崩溃。