在Objective-C中将类的实例投射到@protocol

我有一个对象(一个UIViewController)可能会或可能不符合我定义的协议。

我知道我可以确定对象是否符合协议,然后安全地调用方法:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { [self.myViewController protocolMethod]; // <-- warning here } 

但是,XCode显示一个警告:

 warning 'UIViewController' may not respond to '-protocolMethod' 

什么是防止此警告的正确方法? 我似乎无法将self.myViewController作为MyProtocol类。

正确的做法是做:

 if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController; [vc protocolMethod]; } 

UIViewController <MyProtocol> *types转换转换为“vc是符合MyProtocol的UIViewController对象”,而使用id <MyProtocol>转换为“vc是符合MyProtocol的未知类的对象”。

这样编译器会给你适当的vctypes检查 – 如果调用了UIViewController或者<MyProtocol>没有声明的方法,编译器只会给你一个警告。 只有在你不知道正在被施放的对象的类/types的情况下才应该使用id

你可以像这样施放它:

 if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { id<MyProtocol> p = (id<MyProtocol>)self.myViewController; [p protocolMethod]; } 

这也让我有点不安。 在Objective-C中,协议不是types本身,所以你需要指定id (或其他types,比如NSObject )以及你想要的协议。