2016-09-29 5 views
0
PeopleClass.h 

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

実装ファイルでプロパティを突然変異さ、私は唯一の.mファイルに変更可能な上記peopleプロパティ(NSMutableDictionaryを)したいと思います。だから私はpeople辞書を変更すると、変更はインターフェイスに反映されますNSDictionaryのObjective-C:

私は以下のようにiVarを作ってみましたが、うまくいかなかった。

PeopleClass.m 

@interface PeopleClass() 
{ 
    NSMutableDictionary *people; 
} 

これを行うにはどうすればよいですか?

答えて

3

独自のインスタンス変数と独自のセッターとゲッターメソッドを用意する必要があります。以下は基本的な設定です:

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するプロパティを変更しても意味が本当にcopyだけでなく、strongを称えるゲッターでしょう。

1

本当に、変更可能な辞書をクライアントへの不変参照として返すことは望ましくありません。まず、後で突然変異させると、その参照を消費するコードは突然変異することができないという前提で書かれているので、破損する可能性が高くなります。第2に、このコードの一部のクライアントは、内容を変更してコードを破損させるバグ(この問題はCocoaで発生している)がある可能性があります。

代わり:

あなたの.mで
@interface PeopleClass : NSObject 
@property (readonly, strong, nonatomic) NSDictionary *people; 
@end 

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

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

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

コピーが(計装&分析により決定)本当にパフォーマンスの問題であれば、あなたの周りのコピーを保持することができますバッキングストアが変更されるたびに無効化/置き換えを行います。

関連する問題