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
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)];
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.
Ja. makeObjectsPerformSelector: ist fast nur eine Abkürzung für das Schreiben dieser: für (ID-Objekt in Array) { [Objekt someSelector: someArgument]; } – Alex
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.
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
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.
- 1. Cocoa NSArray/NSSet: -makeObjectsPerformSelector: vs. schnelle Aufzählung
- 2. Obj-C Wie eine Eigenschaft auf alle Elemente eines Arrays setzen
- 3. Wie warten Sie, bis eine Anwendung in OS X geschlossen wird?
- 4. So verarbeiten Sie ein Array IN PARALLEL
- 5. performSelector für heterogene Elemente in einem Array, das NSInvalidArgumentException verursacht
- 6. Warum stürzt [NSTextStorage setAttributedString] mit NSMutableAttributedString ab?
- 7. iOS GMGridView wie GMGridViewCell Zellen wiederverwenden?
- 8. Xcode - UILabel ändert nicht Wert auf viewDidAppear
- 9. Animate Fortschritt die Farbe der Randbreite einer UIImageView Schicht mit Füllung
- 10. - [WelcomeUI _setViewDelegate:]: Unbekannter Selektor an Instanz gesendet 0xc061110
- 11. iOS 9 Push-Segment verursacht meine App zum Absturz
- 12. Einrichten eines Benutzer-Login mit Firebase, aber bekam eine Sigabrt auf Running App
- 13. Swift: Beenden mit nicht abgefangener Ausnahme vom Typ NSException
- 14. iPhone App stürzt wegen zu wenig Arbeitsspeicher ab, funktioniert aber gut im Simulator
- 15. Navigation einen View-Controller zu einem anderen bekommen
- 16. Core-Daten geben niemals NSData aus dem externen Speicher geladen
- 17. iPhone - Schlechte Leistung eines UITableView mit einer UIScrollView von UIImageViews in jeder Zelle
- 18. App Abschlussfehler aufgrund NSUnknownKeyException
- 19. Nachdem ich den UIVIEw an meinen Code angeschlossen habe, ist er abgestürzt, warum?
- 20. Wie erreicht man diese Animation mit Spritekit?
- 21. Obj-C: Anwendung abstürzt, während NSDictionary zu JSON
- 22. Resolve „‚NSUnknownKeyException‘, Grund: Diese Klasse ist nicht Schlüsselwert Codierung-konform für den Schlüssel X“ Ausnahme
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