我有一个对象(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> *类型转换转换为"vc是符合MyProtocol的UIViewController对象",而使用id <MyProtocol>转换为"vc是符合MyProtocol的未知类的对象".

通过这种方式,编译器将对vc进行适当的类型判断——只有在调用了UIViewController<MyProtocol>上未声明的任何方法时,编译器才会向您发出警告.id只应在您不知道被投射对象的类别/类型的情况下使用.

Objective-c相关问答推荐

viewWillAppear,viewDidAppear 没有被调用,没有触发

iPhone SDK 网络连接检测

等到多个网络请求都执行完毕 - 包括它们的完成块

在 ARC 之后,我应该为调度队列使用什么属性?

保存 UIImage,以错误的方向加载它

iOS performSelectorOnMainThread 有多个参数

将长按手势和拖动手势结合在一起

XCTAssert 和 XCTAssertTrue 有什么区别?

setStatusBarHidden 在 iOS 9.0 中已弃用

使用 UIViewControllerInteractiveTransitioning 委托协议实现自定义 UIViewController 交互式过渡的正确方法

CoreData 关系故障?

从 UIScrollView 中删除所有子视图?

如何在 Objective-C 中将 NSString 解析为 BOOL?

Core Data使用原始数据类型的标量属性复选框

如何修复UIPopoverController 已弃用警告?

zoom UIView 及其所有子项

UITableView ,重新加载时滚动到底部?

判断核心数据中是否存在对象的最快方法?

将 NSDate 舍入到最接近的 5 分钟

AVAudioPlayer 不播放任何声音