使用正式协议时,删除"NSObject可能无法响应选择器"警告?

The*_*ine 1 xcode objective-c

我正在尝试编写一个自定义的正式协议,我遇到了Xcode警告的问题.特别:

if([self.delegate conformsToProtocol:@protocol(myProtocol)]){
    [self.delegate myProtocolMethod];
}
Run Code Online (Sandbox Code Playgroud)

这在运行时完全正常,但Xcode一直给我"NSObject可能不响应-myProtocolMethod"警告.我真的想删除警告,所以我在这里做错了吗?

ugh*_*fhw 5

如果您刚刚检查了协议,编译器并不在意.它只关心您调用方法的对象的数据类型.最简单的方法是将结果self.delegate转换为声明协议的类型.

if([self.delegate conformsToProtocol:@protocol(myProtocol)]) {
    [(NSObject * <myProtocol>)self.delegate myProtocolMethod];
}
Run Code Online (Sandbox Code Playgroud)

或者,如果委托属性应始终实现此协议,则可以更改属性声明以包含它.这甚至更好,因为如果您尝试将未实现协议的对象分配为委托,编译器将发出警告.

@property (modifiers) NSObject * <myProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)

  • 我一般建议在这里使用`id`而不是`NSObject`.然后确保`<myProtocol>`继承自`<NSObject>`.这允许`NSProxy`对象正常工作.并且总是将协议命名为具有领先优势的协议. (3认同)