![](/img/trans.png)
[英]inheritance from non-protocol type 'UIViewController' @objc protocol User: UIViewController
[英]objc incompatible pointer type with protocol inheritance
我正在使用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中声明的任何内容。我缺少什么吗? 任何解释将不胜感激。
可能是因为SomeObject
不仅仅是id<A>
。 就像使用指向基类的指针初始化派生类的对象一样。 您可以使用SomeObject
初始化id<A>
的实例,但是反之亦然,您会收到一条警告,提示:“嘿,伙计,您刚刚将基数分配给派生对象,即派生对象(SomeObject *)
基本id<A>
可能缺少(SomeObject *)
例如, SomeObject
可能包含协议A
不存在的方法foo
,但是在您的赋值之后,如果您向obj
发送foo
消息,则它可能会崩溃,因为id<A>
不一定具有此方法。 如果它也是SomeObject
的实例,也可以,但是可以是任何东西,它仅对A
声明的方法作出响应。
我希望所有这些都有意义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.