ios - objc 与协议(protocol)继承不兼容的指针类型

标签 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 必须实现协议(protocol) A 中声明的任何内容。我缺少什么吗?任何解释将不胜感激。

最佳答案

可能这是因为SomeObject不仅仅是 id<A> 。这就像用指向基类的指针初始化派生类的对象。您可以初始化 id<A> 的实例与 SomeObject但反之亦然时,您会收到一条警告,其中显示:“嘿,伙计,您刚刚将基数分配给派生,即派生 (SomeObject *) 中存在的内容可能会在基数 id<A> 中丢失”

例如SomeObject可能包含方法foo协议(protocol) A 中不存在,但现在在您的分配之后,如果您发送 foo留言至obj它可能会崩溃,因为 id<A>也不一定有这个方法。如果它也是 SomeObject 的实例,则可以。 ,但它可以是任何东西,它必然只响应 A 中声明的方法.

我希望这一切都有意义

关于ios - objc 与协议(protocol)继承不兼容的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22553363/

相关文章:

ios - swift:将字符串转换为 double 时出现问题

objective-c - 以编程方式显示相机快门?

iOS 应用程序切片或细化不起作用

ios - 使用 nodesForXPath 时出错

ios - 如何在类属性中的 Objective C 中创建类似 json 的结构?

ios - UIPickerview 未出现在正确的位置

ios - AutoLayout:多行标签和固定大小的按钮

ios - 如何使用 Realm 保存NSURL数组?

ios - .car 在 iOS 中代表什么?编译 Assets (______)..?

iphone - UITabBar 和 UITabBarController 有什么区别?