2014-01-14 24 views
4

我有一個包含字典JSONData的對象。從頭文件和其他將訪問它的類中,我希望此屬性只能是隻讀和不可變的。如何在頭文件(.h)中實現不可變的只讀屬性,實現中的可變讀寫屬性(.m)

@interface MyObject : NSObject 

@property (readonly, strong, nonatomic) NSDictionary *JSONData; 

@end 

不過,我需要它是readwrite,並從實現文件可變的,像這樣的,但是這並不工作:

@interface MyObject() 

@property (readwrite, strong, nonatomic) NSMutableDictionary *JSONData; 

@end 

@implementation MyObject 

// Do read/write stuff here. 

@end 

有什麼我可以做強制執行的那種抽象我要去?我看了其他問題,雖然我已經知道如何從.hreadwrite開始 .m,我找不到任何關於可變性的區別。

回答

7

在實現中,您需要一個單獨的可變專用變量。你可以重寫getter來返回一個不可變的對象。

@interface MyObject() { 
    NSMutableDictionary *_mutableJSONData; 
} 
@end 

@implementation MyObject 

// ... 

-(NSDictionary *)JSONData { 
    return [NSDictionary dictionaryWithDictionary:_mutableJSONData]; 
} 

// ... 
@end 

無需執行setter,因爲它是readonly

+0

這就是答案。 – gran33

+0

是的,我實際上也找到了自己的解決方案。注意:**不要在實現中的任何位置使用'self.rawData [@「key」] = @「value」',因爲它不起作用。 '_rawData [@「key」] = @「value」'但是,因爲你正在訪問實例變量而不是屬性(被聲明爲不可變)。我真的需要重寫getter嗎? –

+0

是的。你正在返回一個不同類的對象。 – Mundi