objc与协议继承不兼容的指针类型

时间:2014-03-21 08:09:07

标签: ios objective-c cocoa-touch objc-protocol

我正在使用Xcode版本5.1,iOS SDK版本7.1。 以下是同一文件中的一些示例声明:

@protocol A <NSObject>
@end

@protocol B <A>
@end

@interface SomeObject : NSObject <B>
@end

@interface SomeContainer : NSObject
- (id<A>)pop;
@end

Xcode在以下代码中生成警告:

SomeContainer *container = [[SomeContainer alloc] init];
SomeObject *obj = [container pop]; // Warning: Initializing 'SomeObject *__strong' with and expression of incompatible type 'id<A>'

我知道类型转换会消除警告,但是,我不明白我为什么需要它。 SomeObject必须实现协议A中声明的任何内容。是否存在我遗漏的内容?任何解释都将不胜感激。

1 个答案:

答案 0 :(得分:3)

可能这是因为SomeObject不仅仅是id<A>。它就像用指向基类的指针初始化派生类的对象一样。您可以使用id<A>初始化SomeObject的实例,但当您执行此操作时,您会收到警告,其中显示:&#34;嘿,伙计您刚刚分配base to derived,即派生(SomeObject *)中存在的内容可能会遗漏在id<A>&#34;

例如SomeObject可能包含协议foo中不存在的方法A,但是如果您将foo消息发送到{{1它可能会崩溃,因为obj不一定有这种方法。它可以,如果它也是id<A>的实例,但它可以是任何东西,它必须只响应SomeObject中声明的方法。

我希望这一切都有意义