2016-07-26 7 views
1

Ich habe gerade gelernt, wie KVO, aber nur die Grundlagen zu verwenden. Was ich erreichen muss, ist etwas in der Art:Objective C - How To Verweis auf mehrere Objekte mit Schlüsseln wie NSMutableDictionary Works

Ich habe einen Delegat Anruf, der ein Speaker Objekt übergibt.

- (void)onSpeakerFound:(Speaker *)speaker 

Sobald erhalte ich diese Speaker im UI-Teil, von dort werde ich Beobachter für dieses Objekt zugewiesen werden.

Aber das ist nur für einen Lautsprecher. Was passiert, wenn ich mehrere Sprecher im Auge habe? Ich muss für diese Sprecher Beobachter separat zuweisen und gleichzeitig möchte ich ihre Referenzen für weitere Aktualisierungen der Werte behalten.

Jeder Lautsprecher konnte von Zeit zu Zeit aktualisiert werden. Wenn ich also feststelle, dass sich bei einem Lautsprecher etwas geändert hat, möchte ich auf die Referenz zu diesem Lautsprecher zugreifen und die Werte aktualisieren, so wie NSMutableDictionary funktioniert.

NSMutableDictionary erstellt eine Kopie eines Objektsatzes, so dass es ein Differenzobjekt ist, wenn ich es wieder aus dem Wörterbuch bekomme.

Gibt es also eine Klasse, die es mir erlaubt, ein Objekt zu verfolgen, indem ich nur eine Referenz nur auf dieses Objekt lege, ohne es zu kopieren?

EDIT: Ein Test gemacht, um zu überprüfen, dass, wenn ein instanziiertes Objekt in einem NSMutableDictionary gesetzt ist, das instanziierte Objekt nicht mit dem in NSMutableDictionary festgelegten referenziert wird.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

    NSString *obj = @"initial value"; 
    NSString *key = @"key"; 

    [dict setObject:obj forKey:key]; 

    NSLog(@"Object is now %@", [dict objectForKey:key]); 

    obj = @"changed value"; 

    NSLog(@"Object is now %@", [dict objectForKey:key]); 
} 

Log:

2016-07-26 21:04:58.759 AutoLayoutTest[49723:2144268] Object is now initial value 
2016-07-26 21:04:58.761 AutoLayoutTest[49723:2144268] Object is now initial value 
+0

Könnten Sie log 'NSLog (@ "Adresse% p", obj);' nach der Erstellung, nachdem er wieder aus dem Wörterbuch bekommen, und dann nach ihrem Wert zu ändern? Du wirst den Unterschied sehen. Führen Sie einen anderen Test durch, jedoch mit einem 'NSMutableString' statt einer Instanz, die Zeichen ersetzt:' [(NSMutableString *) obj replaceCharactersInRange: NSMakeRange (0, [@ "anfängliche" Länge]) withString: @ "Ersetzung"]; ' – Larme

+0

@Larme Danke , Ich führe mich nur zur Verwirrung mit der Sache NSString. –

Antwort

1

NSMutableDictionary eine Kopie eines auf sie gesetzt Objekt macht ...

die nicht korrekt ist; Es wird eine Referenz auf das Objekt hinzugefügt. Es wird dasselbe Objekt sein, auf das innerhalb und außerhalb der Objective-C-Sammlung verwiesen wird.

Gibt es also eine Klasse, mit der ich ein Objekt verfolgen kann ...?

Wahrscheinlich NSMutableSet wenn Sie nur eine Liste der Objekte möchten. Das wird dafür sorgen, dass Sie einen eindeutigen Verweis auf jedes Objekt haben, jedoch müssen Sie die Methoden hash und für diese Objekte implementieren, damit sie sich korrekt verhalten. Ansonsten NSMutableDictionary wenn Sie schnell nach Schlüsseln suchen wollen.

+0

Nein, ich habe einen Test gemacht.Ich habe ein Objekt instanziiert und es auf ein NSMutableDictionary festgelegt. Dann änderte ich den Wert dieses Objekts, dann protokollierte ich den Wert des Objekts, das zuvor auf NSMutableDictionary festgelegt wurde. Der Wert dieses Objekts hat sich nicht geändert. –

+0

@JLT Ihr Test ist dann falsch, fürchte ich. Ich stehe zu meiner Antwort. – Droppy

+0

Sie können es jetzt selbst ausprobieren, um zu überprüfen, ob ich falsch liege oder nicht. –

0

-try diese

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

    NSString *obj = @"initial value"; 
    NSString *key = @"key"; 

    [dict setObject:obj forKey:key]; 

    NSLog(@"Object is now %@", [dict objectForKey:key]); 

    obj = @"changed value"; 
    [dict setObject:obj forKey:Key]; 

    NSLog(@"Object is now %@", [dict objectForKey:key]); 
} 
+0

Ich weiß, dass Sie es erneut einstellen müssen, um die Referenz zu aktualisieren. –