是否有可能在类扩展中声明受保护的ivar并且超类能够访问它或做什么?

时间:2013-10-05 01:43:36

标签: objective-c

我有一个内部使用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

但我不能。有没有办法做到这一点?

1 个答案:

答案 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