conformsToProtocol检查后转换

时间:2012-09-26 18:39:51

标签: objective-c casting protocols

我只是想更深入地了解Objective C。

为什么我必须在通话前进行投射以避免警告?这对编译器来说不是一块蛋糕吗?我缺少任何动态方面吗?

if ([a.class conformsToProtocol:@protocol(P1)])
{
  [(id<P1>)a p1Message];
}

我的意思是,我从C / C ++的角度理解它,但毕竟我使用的是Objective C编译器而且我不喜欢强制转换。 :)

1 个答案:

答案 0 :(得分:1)

如果a是一个在编译时将其自身声明为实现P1的特定类型,那么您不需要强制转换。

如果a的类型为id,那么只有当返回类型不明确并且您实际使用它时,或者如果它有参数时,您才需要进行强制转换。这通常意味着方法名称p1Message有多个方法签名,因此编译器不知道期望哪个。

如果某个类型的a没有声明自己是实现P1那么 - 除非它单独(并且重复地)声明p1Message - 你会收到警告,因为你'调用对象可能无法实现的方法。

如果我不得不猜测,可能a被声明为类型为id而不是id <P1>(对于委托来说更为正常)并且您有多个{{} 1}}飞来飞去。您也可以主动放置强制转换,因为有一天您可能有多个具有相同名称的不同消息,而另一个可能实现p1Message的其他人不应该知道某个人使用该方法名称的项目中的每个其他位置

编译器不能从p1Message检查中引出完全调用conformsToProtocol:是安全的,因为它是动态运行时。您可能在编译时或运行时替换了p1Message的不同实现,这意味着假设编译器知道它的作用是不安全的。该调用将像其他调用一样动态调度。