0

我有这种代码:

我的类.h

#import "MyOtherClass.h"

@interface MyClass : NSObject<SomeProtocol, MyOtherClassDelegate> {
...
}

我的班级.m

+ (void) doThis {
   [someObject doThisWithDelegate:self];  // someObject is MyOtherClass type
}

MyOtherClass.h:

@protocol MyOtherClassDelegate <NSObject>
@required
// Some methods
@end

- (void) doThisWithDelegate:(id<SomeOtherProtocol>)delegate;

MyOtherClass.m:

- (void) doThisWithDelegate:(id<SomeOtherProtocol>)delegate {
    if ([delegate respondsToSelector:@selector(myProtocolMethod:error:)]) do things;
}

这样做,我在编译时有以下警告

在线上[someObject doThisWithDelegate:self];

"Incompatible pointer types sending Class to parameter of type id<SomeOtherProtocol>"

在 MyOtherClass.h 中的方法 declaratéin 上:

"Passing argument to parameter 'delegate' here"

之前,我没有输入 id 参数(用id<SomeOtherProtocol>),它只是“单独”(id)。我注意到测试:

if ([delegate respondsToSelector:@selector(myProtocolMethod:error:)])

返回 FALSE(当然方法是在委托中实现和声明的)。

所以我决定尝试强制id类型符合在编译时导致我警告的协议。

这里发生了什么?
为什么我有这个错误,为什么respondsToSelector不返回 TRUE ?

4

3 回答 3

1

如果您想调用respondsToSelector:类型为的属性,请id<SomeProtocol>确保您的协议符合NSObject协议。

例子:

@protocol SomeOtherProtocol <NSObject>
// methods
@end

这将允许您执行以下操作:

if ([self.delegate respondsToSelector:@selector(myProtocolMethod:error:)]) {
}

这假设delegate定义为:

@property (nonatomic, weak) id<SomeOtherProtocol> delegate;
于 2013-06-14T23:44:38.323 回答
1

首先确保你符合,respondsToSelector 是 NSObject 的一部分。

其次,我会检查我是否有效地设置了委托属性。

这一行:

if ([self.delegate respondsToSelector:@selector(myProtocolMethod:error:)]) 

应该可以工作,因为属性委托指向一个应该有 myProtocolMethod:error: ... 的对象。

我可能会在委托的设置器上使用断点或测试进行调试:

-(void)setDelegate:(id)delegate 
{
NSLog("We are setting a delegate!: %@", [delegate description]);
 _delegate = delegate;
}

如果在运行应用程序时,在执行 if 行之后看到“我们设置 ....”,或者根本看不到它,那么您知道问题出在哪里。

于 2013-06-15T08:46:19.307 回答
0

问题是我已经将该doThis方法声明为类方法而不是实例方法。所以self作为参数传递时无效。

于 2013-06-30T10:37:54.347 回答