2010-05-03 28 views
15

Entfernen I über die folgende Verknüpfung gestoßen in ein up-Einstellung für Schleife (Verknüpfung im Vergleich zu dem Lehrbuch Beispiele I verwendet wurde):Objekt aus NSMutableArray

for (Item *i in items){ ... } 

In Bezug auf das längere Format Gegensatz:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right 

Wenn ich die kürzere Version verwende, gibt es eine Möglichkeit, das Element zu entfernen, das gerade iteriert wird (zB 'i')? Oder muss ich das längere Format verwenden?

+0

Die erste for-Schleife wie die FOR-Schleife bekannt ist verbessert und die zweite Einer ist der alte Standard-FOR-Schleife. Ich lerne dies bei meiner Java-Zertifizierung. – Popeye

+0

Wenn Sie wirklich Elemente aus dem Array entfernen müssen, während Sie es iterieren, und Sie können sie später nicht mit 'removeObjectsInArray:' oder 'removeObjectsAtIndexes:' wie von @Vladimir vorgeschlagen entfernen, können Sie immer über eine Kopie des ursprünglichen Arrays iterieren. – Tiago

Antwort

31

Sie können keine Objekte aus dem Array entfernen, während fast-enumerating es:

numeration „sicher“ ist -die enumerator eine Mutation Wache hat, so dass, wenn Sie Versuch, die Sammlung während der Enumeration zu ändern, ist eine Ausnahme angehoben.

Wie auch immer, warum müssen Sie den Container während der Aufzählung ändern? Erwägen Sie, Elemente zu speichern, die gelöscht werden müssen, und entfernen Sie sie mit der Methode removeObjectsInArray: oder removeObjectsAtIndexes: aus Ihrem Container.

+0

Danke. Ich ändere es beim Aufzählen, weil es eine temporäre Warteschlange ist. Ich verschiebe alle Elemente in ein anderes Array. –

+1

Wenn Sie * all * die Objekte in ein anderes Array verschieben, versuchen Sie Folgendes: '[destinationArray addObjectsFromArray: sourceArray]; [sourceArray removeAllObjects]; ' – JeremyP

+0

Ja, ich fand das - danke. –

1

Die ehemalige Schleife ist ein "for-each" Schleife in Objective C.

* i im Artikel-Array ein Zeiger auf den direkten Punkt ist (die meiste Zeit wird dies NSMutableArray sein).

diese Weise können Sie direkt auf den Punkt arbeiten:

[items removeObject: i]; 

Diese (sollte) Arbeit - ich auf meinem Mac bin zur Zeit nicht funktioniert und es nicht überprüfen können. Es kann jedoch sein, dass Objective-C verhindert, dass Objekte beim Iterieren über die Sammlung entfernt werden (was in den meisten Sprachen recht häufig vorkommt).

+0

Es ist in der Tat der Fall, dass Sie ein 'NSMutableArray' nicht entfernen (oder mutieren) können, während Sie darüber aufzählen, so dass der Aufruf' removeObject: 'eine Ausnahme auslöst. (wie von Vladimir in seiner Antwort erklärt) –

9

Fügen Sie einfach Stichwort break; nach dem Artikel zu entfernen ...

for(id item in items) { 
    if([item isEqual:itemToDelete]) { 
     [items removeObject:item]; 
     break; 
    } 
} 
+4

@ Abdullah71 mit ID, die Sie nie benutzen *. – rptwsthi

+0

Dadurch wird ein Objekt entfernt und die Iteration wird gestoppt, wodurch mögliche andere Objekte, die entfernt werden sollen, fehlen. Verwenden Sie dies also nur, wenn Sie pro Iteration null zu einem Objekt entfernen müssen. – marsbear

3

Eine Objective-C Sammlung muss bei der Aufzählung nicht geändert werden.

können Sie diese Variante verwenden, um Objekte aus der Sammlung zu löschen:

for (NSInteger i = items.count - 1; i >= 0 ; i--) { 
    [items removeObjectAtIndex:i]; 
} 
+0

Imho der kürzeste Weg, es richtig zu tun, da es gut mit Ihrer Geschäftslogik ist, das Array von hinten nach vorne zu durchlaufen. – marsbear

0

Ich benutze diesen Code dafür:

for (NSUInteger i = [items count] - 1; ; i--) { 
    [items removeObjectAtIndex:i]; 
} 
+0

Unendliche Schleife ?! – Pang

+0

Nur bis ich -1 bekomme ... dann stürzt es ab :) – marsbear

Verwandte Themen