2013-10-05 23 views
2

我有一個內部使用伊娃的類。我不希望暴露在類(頭)的公共接口伊娃但我聲明,並在實現文件中使用它,就像這樣:是否有可能在類擴展中聲明一個受保護的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 

但我不能。有沒有辦法做到這一點?

回答

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 
+0

是的,我想通;就此而言,另一種選擇是創建私有或「友誼」(術語ala C++)協議。只是想也許有一種解決辦法。 – SaldaVonSchwartz

+0

觀察現代Apple框架的類轉儲CloudKit,看起來他們正在選擇製作其受保護的ivars屬性。這讓我想知道他們是否在訪問子類inits和dealloc中的self.privateData,這通常是不好的做法。 – malhal

相關問題