1

在 Objective-C 中,哪种编码方式更好?

// 版本 #1

id obj<MyProtocol>;
[obj myMessage];

// 版本 #2

   id obj;
   if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
       [obj myMessage];

出于某种原因,我在示例代码中看到了版本 1,但对我而言,版本 2 似乎更安全。如果在运行时从不符合协议 MyProtocol 的通用 id 分配 obj 会发生什么?

4

3 回答 3

9

第一个是编译时检查。

第二个是运行时检查。

Isaac 对“两者都做”的回答当然是可行的,但协议一致性检查在某些时候在某些地方有很大的开销(警告;过早的优化等等)。同样,协议确实支持@optional 方法。

我建议在运行时同时使用编译时协议检查(即声明性、精确性、接口和使用)respondsToSelector:。随着代码的重构并且速度非常快,这将使到/从@optional/的转换变得更容易。@requiredrespondsToSelector:

于 2013-03-11T23:22:10.320 回答
1

两者都做:

id<MyProtocol> obj;
if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
{
    [obj myMessage];
}

第一个,变量类型,告诉编译器你打算用这个变量做什么,但不保证这个变量实际上会保存你想要的东西;第二个,一致性检查,测试变量是否实际包含您想要的内容。

于 2013-03-11T23:22:09.273 回答
1

由于objective-c 在运行时绑定并且不是类型保存,所以两者都做。正确的声明可以防止在编译时检测到的所有错误。出于充分的理由,其中大多数只是警告。运行时检查可防止应用程序在您未获得预期处理的参考时崩溃。

于 2013-03-11T23:39:22.187 回答