Aus Gründen der Klarheit möchte ich eine erste Schleife erstellen, in der ich die zu löschenden Elemente sammle. Dann lösche ich sie. Hier ist ein Beispiel mit der Objective-C 2.0-Syntax:
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
Dann gibt es keine Frage, ob die Indizes korrekt aktualisiert werden oder andere kleine Buchhaltungsdetails.
Bearbeitet, um hinzuzufügen:
In anderen Antworten wurde festgestellt, dass die inverse Formulierung schneller sein sollte. dh wenn Sie das Array durchlaufen und ein neues Array von Objekten erstellen, die beibehalten werden sollen, anstatt Objekte, die verworfen werden sollen. Das mag wahr sein (obwohl was ist mit den Speicher- und Verarbeitungskosten für das Zuweisen eines neuen Arrays und das Verwerfen des alten Arrays?), Aber selbst wenn es schneller ist, ist es möglicherweise nicht so wichtig wie für eine naive Implementierung, weil NSArrays Verhalten Sie sich nicht wie "normale" Arrays. Sie reden, aber sie gehen einen anderen Weg. Eine gute Analyse finden Sie hier:
Die inverse Formulierung mag schneller sein, aber ich musste mich nie darum kümmern, ob dies der Fall ist, da die obige Formulierung für meine Bedürfnisse immer schnell genug war.
Für mich ist die Botschaft zum Mitnehmen, die für Sie klarste Formulierung zu verwenden. Nur bei Bedarf optimieren. Ich persönlich finde die obige Formulierung am klarsten, weshalb ich sie verwende. Aber wenn Ihnen die umgekehrte Formulierung klarer ist, machen Sie es.