2009-02-18 8 views
17

Ich möchte, dass alle Objekte in einem Array einen Selektor ausführen. Ich habe die entsprechend genannte makeObjectsPerformSelector: Methode entdeckt, aber ich habe eine Frage damit. Wenn ich es für ein Array verwende, wird es das vorhandene Array ändern oder ein neues zurückgeben? Wenn das vorhandene Objekt geändert wird, was ist der einfachste Weg, ein neues Array mit dem angewendeten Selektor zurückzugeben?makeObjectsPerformSelector:

Antwort

29

makeObjectsPerformSelector: wird diesen Selektor für jedes Objekt im Array ausführen. Wenn diese Objekte vom Selektor geändert werden, werden sie geändert. Es gibt nichts zurück. Jetzt gibt es einen Haken, der besagt, dass die meisten Kopien in Cocoa standardmäßig flache Kopien sind, was bedeutet, dass Sie ein neues Array erhalten, aber die zugrunde liegenden Objekte, auf die es zeigt, dieselben Objekte sind. Sie müssen initWithArray: copyItems verwenden, damit die Elemente auf Root-Ebene ebenfalls kopiert werden. Wenn Sie ein neues Array mit den veränderten Objekte, sowie die alte Array wollen etwas tun, wie folgt aus:

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES]; 
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)]; 
+4

Der Selektor, der an '-makeObjectsPerformSelector übergeben wird:' benötigt keine Argumente.(Es ist in [die Dokumente] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html).) Aber Ihr Selektor, wie gezeigt, tut. – trudyscousin

2

Ich hoffe, ich bin zu interpretieren dies richtig ...

Wenn Sie [myArray makeObjectsPerformSelector tun: someSelector], iterieren Sie effektiv myArray und senden die Selector-Nachricht an jedes Objekt. Das Array ist unverändert, da makeObjectsPerformSelector seinen Inhalt nicht ändern darf.

Also am Ende haben Sie das gleiche Array mit den gleichen Objekten.

+2

Ja. makeObjectsPerformSelector: ist fast nur eine Abkürzung für das Schreiben dieser: für (ID-Objekt in Array) { [Objekt someSelector: someArgument]; } – Alex

15

Wenn ich es auf einem Array verwende, wird es das vorhandene Array ändern oder ein neues zurückgeben?

Nr

Zunächst einmal, lesen Sie die Unterschrift:

- (void)makeObjectsPerformSelector:(SEL)aSelector 

void, ohne Sterne, nachdem es bedeutet „nichts zurückgeben“.

Zweitens, beachten Sie, dass dies eine Methode von NSArray ist, die eine unveränderliche Klasse ist. Daher mutiert makeObjectsPerformSelector: das empfangende Array nicht, weil das unmöglich ist.

Es gibt NSMutableArray, und da dies eine Unterklasse von NSArray ist, erbt es makeObjectsPerformSelector:. Wenn NSMutableArray jedoch das Verhalten dieser Methode änderte, hätte ihre Dokumentation eine eigene Auflistung für die Methode (siehe die zahlreichen Definitionen der Dokumentation init in verschiedenen Klassen). Es gibt keine solche Auflistung, daher können Sie sicher (und richtig) folgern, dass -[NSMutableArray makeObjectsPerformSelector:] genauso funktioniert wie -[NSArray makeObjectsPerformSelector:].

Die Objekte können sich selbst als Antwort auf Ihre Nachricht ändern, aber das Array selbst enthält die gleichen Objekte nach makeObjectsPerformSelector: wie zuvor.

+0

Ja. Ich komme aus Ruby zu objective-c, manchmal vergesse ich die Objektbeschreibung. Ich habe herausgefunden, was makeObjectsPerformSelector wirklich macht, nachdem ich eine Weile darüber nachgedacht habe. – Allyn

7

Zusätzlich zu anderen Antworten, wenn Sie eine Methode mit dem Ergebnis des Aufrufs erstellen möchten ein neues Array tun , können Sie dies tun:

NSArray *derivedArray = [originalArray valueForKey:@"foo"]; 

Dies wird nur Arbeit, wenn Ihre Objekte verarbeiten kann eine '-valueForKey: @ "foo"' Nachricht und offensichtlich, ist nur für Methoden geeignet, die keine Argumente annehmen und einen Nicht-Null-Wert zurückgeben.

Verwandte Themen