4

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

@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是一个子类。BBB

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

目前 Clang 正在生成警告。我怎么能在没有警告的情况下做到这一点?

更新

我的意图是公开可变类类型以启用对对象树的就地编辑。readonly/readwrite其实没关系。我想我有两个选择要避免。

  • 使用类别。
  • 添加分离的可变版本访问器。(类似于-mutableBytes中的方法NSMutableData

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

4

1 回答 1

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而不是它们的可变对应物来声明另一组属性。通过这种方式,您可以避免暴露可变性,并且如果您需要它是 internal ,您可以稍后在类扩展中安全地重新声明该属性。说到内部属性,这里是 m 文件:readwritereadwrite

//  CFIAAAsAndBBBs.m

#import "CFIAAAsAndBBBs.h"

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

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

没有更多的警告,每个人都会成为赢家。

于 2013-06-28T04:20:17.673 回答