2016-09-29 17 views
0
PeopleClass.h 

@interface PeopleClass : NSObject 
@property (strong, nonatomic) NSDictionary *people; 
@end 

我想作上述可變(NSMutableDictionary)僅在.m文件的people屬性。所以,當我突變people字典,變化反映在接口NSDictionary的Objective-C:在實現文件中變異的特性

我已經嘗試製作像下面的iVar,但沒有奏效。

PeopleClass.m 

@interface PeopleClass() 
{ 
    NSMutableDictionary *people; 
} 

完成此操作的最佳方法是什麼?

回答

3

要做你想要的,你需要提供你自己的實例變量和你自己的setter和getter方法。以下是基本設置:

PeopleClass.h

@interface PeopleClass : NSObject 
@property (strong, nonatomic) NSDictionary *people; 
@end 

PeopleClass.m

@implementation PeopleClass { 
    NSMutableDictionary *_people; 
} 

- (NSDictionary *)people { 
    return [_people copy]; // or just return _people 
} 

- (void)setPeople:(NSDictionary *)people { 
    _people = [people mutableCopy]; 
} 

在getter方法中使用的copy是可選的。這取決於您希望如何處理結果。

它很可能也是有道理改變屬性爲copy而不是strong因爲二傳手的實施和getter真正兌現copy並不僅僅是strong

1

你真的不想將可變字典作爲客戶端的不可變引用返回。首先,如果稍後進行變異,那麼消耗該引用的代碼很可能會因爲它不能變異的假設而寫入而破壞。其次,所述代碼的某些客戶端可能會有一個錯誤,導致內容發生變化,從而導致代碼中斷(這發生在Cocoa中)。

相反:

@interface PeopleClass : NSObject 
@property (readonly, strong, nonatomic) NSDictionary *people; 
@end 

在您的m:

@interface PeopleClass() 
@property (strong, nonatomic) NSMutableDictionary *mutablePeople; 

- ... init ... 
{ 
    .... 
    _mutablePeople = [[NSMutableDictionary alloc] init]; 
    .... 
} 

- (NSDictionary *) people 
{ 
    return [_mutablePeople copy]; 
} 

如果複製是真的一個性能問題(由儀表&分析確定的),那麼你就可以保持副本各地並在後備存儲發生變化時使其無效/取代。