2016-11-16 1 views
1

Ich habe ein seltsames Problem. Ich habe ein Singleton mit Wörterbuch darin. Dieses Wörterbuch wird regelmäßig in Laufzeit aktualisiert. In einem Viewcontroller greife ich auf dieses Singleton-Wörterbuch zu und erstelle ein neues NSMutableArray.NSMutableArray automatische Updates mit Wörterbuch in Singleton

@property (nonatomic, retain) NSMutableArray *myArray; 

es in viewDidLoad Initialized:

_myArray = [[NSMutableArray alloc] init]; 

Dann in viewDidAppear, ich zuweisen das Array zu dem Singleton NSMutableDictionary * myDict Werte:

_myArray = [NSMutableArray arrayWithArray:[[[DataCenter singleton] myDict] allValues]]; 

Bevor irgendetwas zu _myArray tun, Ich überwache _myArray-Werte in einem Timer und es scheint, dass es sich immer weiter ändert, wenn man den Singleton-Wörterbuchwerten folgt.

Warum und wie erstellt man ein unabhängiges NSMutableArray, das nicht irgendwie mit diesem Wörterbuch Singleton verbunden ist?

Antwort

3

Es ist kein komisches Problem, es funktioniert wie Objective-C. Ihr Singleton-Array ist nur eine Sammlung von Objektreferenzen. Sie haben _myArray mit genau denselben Referenzen ausgefüllt. Alle Modifikationen in einem werden vom anderen reflektiert, denn sie sind die gleichen Objekte.

Um tatsächlich neue Objekte zu erstellen, müssen Sie eine Kopie erstellen. Etwas wie folgt aus:

_myArray = [[NSMutableArray alloc] initWithArray:[[[DataCenter singleton] myDict] allValues] copyItems:YES]; 

EDIT:

ich mit [[[DataCenter singleton] myDict] allValues] in meinem Compiler nicht prüfen kann, sondern ein konstruiertes Beispiel einhüllen Sie mit deepcopy und Array experimentieren.

NSArray *array = [NSArray arrayWithObject:@"foo"]; 
NSMutableArray* _myArray = [[NSMutableArray alloc] initWithArray:array copyItems:YES]; 
+0

einen Fehler Got für NSArray keine sichtbare Schnittstelle sagen die copyItems Wähler erklärt: – GeneCode

+0

Ok ich denke, wir mutableCopy statt copyItems verwenden: JA . Wie auch immer, akzeptiere deine Antwort, sobald du den Code geändert hast. Vielen Dank. – GeneCode

+0

Vielleicht hatte ich da ein falsches bisschen Syntax, aber so weit mein Verständnis geht, erstellt MutableCopy nur eine flache Kopie, während copyItems eine tiefe Kopie erstellt, was ich glaube, was Sie wollen. – Frankie

0

müssen Sie wie unten um das Objekt kopieren:

_myArray =[[NSMutableArray arrayWithArray:[[[DataCenter singleton] myDict] allValues]]mutableCopy]; 
Verwandte Themen