我有一个内部使用ivar的课程。我不想在类的公共接口(标题)中公开ivar,但我在实现文件中声明并使用它,如下所示:
//--------SomeClass.h--------------
@interface SomeClass : NSObject
@end
//--------SomeClass.m--------------
@implementation SomeClass ()
{
@protected
NSMutableDictionary *_privateData;
}
@implementation SomeClass
// ...
@end
然后在SomeClass的子类中,我尝试访问_privateData:
//--------SomeSubClass.m--------------
@implementation SomeSubClass
// ...
- (void)someMethod {
NSLog(@"%@", _privateData); // NOPE
NSLog(@"%@", self->_privateData); // NOPE
NSLog(@"%@", super->_privateData); // NOPE
}
// ...
@end
但我不能。有没有办法做到这一点?
答案 0 :(得分:2)
为了实现所需的行为,您应该创建一个子类头文件,该文件声明所有受保护的数据,并在子类“#import
文件中.m
。
MammalSubclass.h:
@interface Mammal () {
@protected
NSMutableDictionary *_privateData;
}
//...
@end
Human.m:
#import "Human.h"
#import "MammalSubclass.h"
@implementation Human //subclasses Mammal
- (void)someMethod {
NSLog(@"%@", _privateData);
}
//...
@end