目标C:不兼容的指针类型发送

时间:2014-10-29 17:16:22

标签: objective-c

我创建了一个名为EventListener的协议:

@protocol EventListener
...
@end

我也有班级Processor,如:

// Processor.m
@synthesize listeners = _listeners; //@property NSMutableArray* in Processor.h

- (id) init {
   self = [super init];
   self.listeners = [[NSMutableArray alloc] init]; //init with empty array
   return self;
}

- (void) addListener:(id<EventListener>)listener {
   [self.listeners addObject:listener];
}

我有另一个名为Plugin的课程:

@interface Plugin : NSObject <EventListener> { ... }
...
@end

在其实施中,我执行:

// Plugin.m
[self.processor addListener:self];

并收到警告

  

不兼容的指针类型发送Plugin*发送到Listener*

类型的参数

我做错了什么?


我来自java世界,并假设因为我的处理器实现了协议,它应该是Listener的类型,如:

interface Listener {
}

class Processor {
List<Listener> listeners = new ArrayList<Listener>();

   void addListener(Listener listener) {
      listeners.add(listener);
   }
}


class Plugin implements Listener {
   Processor processor = new Processor();

   void method() {
      processor.addListener(this);
   }
} 

2 个答案:

答案 0 :(得分:2)

在Objective-C中,类和协议是完全不同的东西 - 与Java的类和接口不同 - 具有不同的语法。

如果你想接受任何类Listener的类,或者是类Listener * 的后代,那么参数将是:

EventListener

如果您想接受任何实现协议id <EventListener> 的类,那么参数将是:

id

由于<EventListener>表示&#34;任何班级类型&#34;并且Listener补充说,传递的任何内容都应该实现该协议。

如果您只想接受EventListener及其实现Listener <EventListener> * 的子类的那些,那么参数将是:

{{1}}

与Java形成鲜明对比,您可以直接使用接口类型而不指定任何类类型约束。

答案 1 :(得分:0)

宣布

时,您可以收到相同的警告
@interface SomeClass <SomeProtocol> : NSObject
@end

而不是

@interface SomeClass : NSObject<SomeProtocol>
@end

第一种语法是正确的,但没有任何意义。