Frage

Ich möchte, dass alle Objekte in einem Array machen einen Selektor auszuführen. Ich habe die entsprechend benannten makeObjectsPerformSelector: Methode entdeckt, aber ich habe eine Frage mit ihm. Wenn ich es auf einem Array verwenden, wird es das bestehende Array ändern oder eine neue zurückkehren? Wenn es das vorhandene Objekt ändert, was der einfachste Weg, ein neues Array mit dem Selektor angewendet zurück?

War es hilfreich?

Lösung

makeObjectsPerformSelector: wird, dass die Wähler gegen jedes Objekt im Array ausgeführt werden soll. Wenn diese Objekte durch den Wähler geändert werden, werden sie geändert werden. Es gibt nichts zurück. Nun gibt es einen Haken, der die flache Kopien standardmäßig die meisten Kopien in Cocoa sind, das bedeutet, dass Sie ein neues Array, aber die zugrunde liegenden Objekte weist es die gleichen Objekte sind. Sie müssen verwenden initWithArray: copyItems es auch die Root-Ebene Artikel kopieren. Wenn Sie ein neues Array mit den veränderten Objekte, sowie die alte Array etwas tun wollen:

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

Andere Tipps

  

Wenn ich es auf einem Array verwenden, wird es das bestehende Array ändern oder eine neue zurückkehren?

Nein.

Zunächst einmal, lesen Sie die Unterschrift:

- (void)makeObjectsPerformSelector:(SEL)aSelector

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

Zweitens beachten Sie, dass dies ein Verfahren zur Herstellung NSArray ist, die eine unveränderliche Klasse ist. Daher wird makeObjectsPerformSelector: nicht das Empfangsarray mutieren, denn das ist unmöglich.

Es gibt NSMutableArray, und da, dass eine Unterklasse von NSArray ist, es erbt makeObjectsPerformSelector:. Wenn jedoch NSMutableArray diese Methode des Verhalten geändert, würde seine Dokumentation einen eigenen Eintrag für das Verfahren hat (die viele Definitionen von init in verschiedenen Klassen-Dokumentation). Es gibt keine solche Liste, so dass Sie sicher (und richtig) ableiten, dass -[NSMutableArray makeObjectsPerformSelector:] funktioniert genauso wie -[NSArray makeObjectsPerformSelector:].

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

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

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

Dies wird nur Arbeit, wenn Ihre Objekte ein ‚-valueForKey: @‚foo‘‘ verarbeiten können Nachricht und natürlich ist für Verfahren nur geeignet, die keine Argumente und gibt einen Nicht-Null-Wert.

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

Wenn Sie das tun [myArray makeObjectsPerformSelector: someSelector], sind Sie effektiv nur durch myArray Iterieren und sendet die Auswahlnachricht an jedes Objekt. Das Array ist unverändert, weil makeObjectsPerformSelector ist ihr Inhalt nicht erlaubt zu ändern.

Also am Ende, haben Sie die gleiche Array mit den gleichen Objekten bekommen.

Im folgenden Beispiel können Sie eine sehen superView erstellt und 10 Subview hinzugefügt, um es dann zu jedem von ihnen senden removeFromSuperView (eine Methode, die in view Klasse ist vorhanden) und das Ergebnis ist Null subview in superView.

Wenn Sie mit JavaScript vertraut und versuchen, so etwas wie map in JavaScript zu finden, ist dies so nicht. map Funktion über jedes Element des Arrays laufen und es mit ersetzt aber hier makeObjectsPerformSelector ein Verfahren ausführen, das in jedem Objekt-Array vorhanden sein.

UIView* superView = [[UIView alloc] initWithFrame:CGRectZero];

for(int i = 0; i < 10; i++){
    UIView* view = [[UIView alloc] initWithFrame:CGRectZero];
    [superView addSubview:view];
}

NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 10
[superView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // removeFromSuperview is exist in `view`, you can call [view removeFromSuperview];
NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 0
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top