Objective C中的协议继承

Mat*_*inn 6 protocols objective-c

我有一个项目,其中包含一个协议,一个实现该协议的类,以及一个实现类的子类.这是我们的生产应用程序.

@protocol ProductionProtocol<NSObject>
@property (nonatomic, retain) NSString *role;
@end

@interface BaseProduction : NSObject<ProductionProtocol>
NSString *role;
@end

@implementation BaseProduction
@synthesize role;
@end

@interface Production : BaseProduction
@end

@implementation Production
@end
Run Code Online (Sandbox Code Playgroud)

我还有一个概念验证(POC)应用程序,它是作为包含生产应用程序的单独项目实现的.在POC应用程序中,我有一个扩展生产协议的协议,以及一个扩展生产类的类.

@protocol POCProtocol<ProductionProtocol>
-(void)cancel;
@end

@interface POC : Production<POCProtocol>
@end

@implementation POC
-(void)cancel{...}
@end
Run Code Online (Sandbox Code Playgroud)

请注意,在ProductionProtocol中,我有一个角色NSString,它被声明并在BaseProduction接口/类中实现.在POC中,我有一个方法'取消',它在协议中声明,但不在接口/类中.

所以这是我的问题:我的类结构设置如下,我得到这个警告:

Property 'role' requires method '-role' to be defined - use @synthesize, @dynamic or provide a method implementation
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我会收到这个警告.由于合成属性在基类中,它们应该可用于POC类 - 并且快速测试似乎证实它们是.那么我在这里做错了什么?

Ano*_*mie 12

Objective-C没有官方语言定义,但根据Apple的说法:

当一个类采用协议时,它必须实现协议声明的所需方法,如前所述.此外,它必须符合所采用的协议所包含的任何协议.如果合并的协议包含其他协议,则该类也必须符合它们.类可以使用以下任一技术符合合并的协议:

  • 实现协议声明的方法
  • 继承自采用协议的类并实现方法

但是,据报道,GCC不承认该属性是在一个合并的协议中,并在超类中实现.您可以将编译器更改为Clang,据报道它会以指定的方式处理它,或者您可以@dynamic用来告诉编译器在运行时将提供该属性的实现(在这种情况下,通过从超类继承) ).