2016-09-29 3 views
0
PeopleClass.h 

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

Ich mag würde die people Eigenschaft über wandelbar (NSMutableDictionary) nur in .m-Datei machen. Also wenn ich people Wörterbuch mutiere, werden die Änderungen in den Schnittstellen NSDictionaryObjective-C: Mutieren eine Eigenschaft in Implementierungsdatei

Ich habe versucht, eine iVar wie unten, aber das hat nicht funktioniert.

PeopleClass.m 

@interface PeopleClass() 
{ 
    NSMutableDictionary *people; 
} 

Was ist der beste Weg, dies zu erreichen?

Antwort

3

Um zu tun, was Sie wollen, müssen Sie Ihre eigene Instanzvariable und Ihre eigenen Setter- und Getter-Methoden bereitstellen. Unten ist der Grundaufbau:

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]; 
} 

Die Verwendung von copy in der Getter-Methode ist optional. Es hängt davon ab, wie das Ergebnis behandelt werden soll.

Es wäre wahrscheinlich auch sinnvoll, die Eigenschaft zu ändern copy statt strong seit der Umsetzung der Setter zu sein und wirklich copy und nicht nur strong Getter ehren.

1

Sie möchten ein veränderbares Wörterbuch nicht als unveränderlichen Verweis auf Clients zurückgeben. Erstens, wenn Sie später mutieren, wird der Code, der diese Referenz verbraucht, wahrscheinlich brechen, wenn er geschrieben wird, mit der Annahme, dass er nicht mutieren kann. Zweitens, einige Clients dieses Codes haben möglicherweise einen Fehler, der den Inhalt verändert, was zum Code-Brechen führt (das ist in Cocoa passiert).

Statt:

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

In .m:

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

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

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

Wenn das Kopieren wirklich ein Leistungsproblem (bestimmt durch Instrumentierung & Analyse), dann können Sie die Kopie halten um und ungültig machen/ersetzen, wenn der Hintergrundspeicher mutiert ist.

Verwandte Themen