在Objective-C中相互引用类和子类

时间:2013-06-28 03:55:00

标签: objective-c inheritance

我有两组不可变/可变类型。

@class AAA;
@class BBB;

@class MutableAAA;
@class MutableBBB;

@interface AAA : NSObject
@property (readonly,nonatomic,copy)    BBB*    bbb;
@end

@interface BBB : NSObject
@property (readonly,nonatomic,copy)    AAA*    aaa;
@end

@interface MutableAAA : AAA
@property (readwrite,nonatomic,copy)   MutableBBB*    bbb;
@end

@interface MutableBBB : BBB
@property (readwrite,nonatomic,copy)   MutableAAA*    aaa;
@end

因为Objective-C支持返回类型协方差,这是完全合法的,但问题是两个类是相互引用的,我不知道如何让编译器知道MutableBBB是{的子类在定义之前{1}}。

当然,我可以回退到类别来解决这个问题,但是我想在主接口体中定义它们,因为这是基本类定义的一部分,而不是额外的方法。

目前Clang正在发出警告。我怎么能在没有警告的情况下这样做?

更新

我的意图是暴露可变类类型以启用对象树的就地编辑。 BBB实际上并不重要。我想我有两个选择,我想避免。

  • 使用类别。
  • 添加分隔的可变版本访问器。 (例如readonly/readwrite中的-mutableBytes方法)

我只是想知道是否还有一些我不知道的未知功能启用了这个相互引用的子类。

1 个答案:

答案 0 :(得分:4)

由于该语言的最新进展,这个问题比它看起来更容易。这正是类扩展存在的原因,为了说明我的观点,我已经定义了一个接口和一个伪方法文件。

//  CFIAAAsAndBBBs.h

@class AAA;
@class BBB;

@interface AAA : NSObject
@property (readonly,nonatomic,copy)    BBB*    bbb;
@end

@interface BBB : NSObject
@property (readonly,nonatomic,copy)    AAA*    aaa;
@end

@interface MutableAAA : AAA
@end

@interface MutableBBB : BBB
@end

首先,请注意我对标题所做的更改。您不必在标头中公开readwrite属性,而是将它们移动到实现文件中。如果需要将它们暴露给任何其他对象,只需使用您定义的超类来声明另一组readwrite属性,而不是它们的可变对应项。通过这种方式,您可以避免暴露可变性,如果您需要在内部readwrite,可以安全地在类扩展中重新声明该属性。说到内部readwrite属性,这里是m文件:

//  CFIAAAsAndBBBs.m

#import "CFIAAAsAndBBBs.h"

@interface MutableAAA ()
@property (readwrite,nonatomic,copy)   MutableBBB*    bbb;
@end

@interface MutableBBB ()
@property (readwrite,nonatomic,copy)   MutableAAA*    aaa;
@end
//...

没有更多警告,每个人都会离开胜利者。