2

我正在使用 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 中声明的任何内容。我缺少什么吗?任何解释将不胜感激。

4

1 回答 1

3

这可能是因为SomeObject不仅仅是id<A>. 这就像用指向基类的指针初始化派生类的对象。您可以初始化 with 的一个实例,id<A>SomeObject反之亦然时,您会收到一条警告,上面写着:“嘿,伙计,您刚刚将 base 分配给了 derived,即在 derived 中存在的东西(SomeObject *) 可能会在 base 中丢失id<A>

例如,SomeObject可能包含foo协议中不存在的方法A,但现在如果您向其发送foo消息,obj则在分配您的方法之后可能会崩溃,因为id<A>不一定有此方法。它可以,如果它也是 的一个实例SomeObject,但它可以是任何东西,它必须只响应在 中声明的方法A

我希望这一切都有意义

于 2014-03-21T08:15:54.330 回答