这是完全可能的,实际上是很好的做法。
在 A.h 中,您应该只导入绝对必要的内容,例如包含您必须公开遵守的协议的标头。需要的任何其他类都应使用@class 和@protocol 预定义。声明您可以只读的任何属性。
@class SomeObject
@interface ClassA : NSObject
@property (strong, nonatomic, readonly) NSString *id;
@property (strong, nonatomic, readonly) SomeObject *object;
@end
在 A.m 中,您应该私下导入您需要的任何标头。此外,实现类别扩展并将任何只读属性重新声明为读写。
#import "SomeObject.h"
@interface ClassA ()
@property (strong, nonatomic, readwrite) NSString *id;
@property (strong, nonatomic, readwrite) SomeObject *object;
@property (strong, nonatomic, readwrite) NSString *entirelyPrivate;
@end
@implementation A
. . . . etc
如果您想让这些值可用于子类,但不能用于其他类,您可以将它们放在一个类别中。这也是由 Apple 框架中的几个类完成的。
例如,创建一个文件ClassA+Subclass.h 并包含:
@interface ClassA (SubclassOnly)
@property (strong, nonatomic, readwrite) NSString *id;
@end
然后只需将其导入需要“受保护”访问的子类的实现。