Objective c 删除“;NSObject可能不响应选择器“;使用正式协议时发出警告?

Objective c 删除“;NSObject可能不响应选择器“;使用正式协议时发出警告?,objective-c,xcode,Objective C,Xcode,我正在尝试编写一个定制的、正式的协议,但我对Xcode的警告有问题。具体而言: if([self.delegate conformsToProtocol:@protocol(myProtocol)]){ [self.delegate myProtocolMethod]; } 这在运行时非常有效,但Xcode一直给我“NSObject可能不响应-myProtocolMethod”警告。我真的很想删除这个警告,那么我是不是做错了什么 编译器不在乎您是否只是检查了协议。它只关心调用方法的对象

我正在尝试编写一个定制的、正式的协议,但我对Xcode的警告有问题。具体而言:

if([self.delegate conformsToProtocol:@protocol(myProtocol)]){
    [self.delegate myProtocolMethod];
}

这在运行时非常有效,但Xcode一直给我“NSObject可能不响应-myProtocolMethod”警告。我真的很想删除这个警告,那么我是不是做错了什么

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

if([self.delegate conformsToProtocol:@protocol(myProtocol)]) {
    [(NSObject * <myProtocol>)self.delegate myProtocolMethod];
}
if([self.protocol:@protocol(myProtocol)]){
[(NSObject*)self.delegate myProtocolMethod];
}
或者,如果委托属性应始终实现此协议,则可以更改属性声明以包含它。这甚至更好,因为如果您尝试将未实现协议的对象指定为委托,编译器将发出警告

@property (modifiers) NSObject * <myProtocol> delegate;
@属性(修饰符)NSObject*委托;

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

if([self.delegate conformsToProtocol:@protocol(myProtocol)]) {
    [(NSObject * <myProtocol>)self.delegate myProtocolMethod];
}
if([self.protocol:@protocol(myProtocol)]){
[(NSObject*)self.delegate myProtocolMethod];
}
或者,如果委托属性应始终实现此协议,则可以更改属性声明以包含它。这甚至更好,因为如果您尝试将未实现协议的对象指定为委托,编译器将发出警告

@property (modifiers) NSObject * <myProtocol> delegate;
@属性(修饰符)NSObject*委托;

您看到警告是因为
self.delegate
的类型,不管它是什么,都没有声明该方法

self.delegate
转换为正确的类或协议以删除警告。例如:

[(id<myProtocol>)self.delegate myProtocolMethod];
[(id)self.delegate myProtocolMethod];

您看到警告是因为
self.delegate
的类型,不管它是什么,都没有声明该方法

self.delegate
转换为正确的类或协议以删除警告。例如:

[(id<myProtocol>)self.delegate myProtocolMethod];
[(id)self.delegate myProtocolMethod];

我通常建议在此处使用
id
,而不是
NSObject
。然后确保
继承自
。这允许
NSProxy
对象正常工作。当然,总是用一个领先的cap来命名协议。@RobNapier我本来打算使用
id
,但是由于OP的错误提到了
NSObject
,我想我应该改用它。这一点很好。这对于编译器来说应该是小菜一碟,不是吗?我的意思是,如果它是一个目标C编译器,它是。。。现在它就像一个C/C++编译器。强制转换是危险的。我通常建议在此处使用
id
,而不是
NSObject
。然后确保
继承自
。这允许
NSProxy
对象正常工作。当然,总是用一个领先的cap来命名协议。@RobNapier我本来打算使用
id
,但是由于OP的错误提到了
NSObject
,我想我应该改用它。这一点很好。这对于编译器来说应该是小菜一碟,不是吗?我的意思是,如果它是一个目标C编译器,它是。。。现在它就像一个C/C++编译器。石膏是危险的。