簡體   English   中英

具有協議繼承的objc不兼容指針類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM