NSMutableArray removeObject: entsorgt 2 Objekte
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
-
-
Nein2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen -
Kann es sein, dass das erste Objekt ein zweites Mal im Array vorhanden ist? Also wirklich die gleiche Instanz?
Dann könnte es m. E. sein, dass das letzte Statement mehrere Elemente des Arrays entfernt.
Zitat aus der Doku:
Removes all occurrences in the array of a given object.
Wäre interessant, ob removeObjectAtIndex:0 den gleichen Effekt hat.
Mattes ... der mit dieser Idee aber auch fürchterlich daneben liegen kann.Diese Seite bleibt aus technischen Gründen unbedruckt.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Zitat ergänzt
-
MyMattes schrieb:
Kann es sein, dass das erste Objekt ein zweites Mal im Array vorhanden ist? Also wirklich die gleiche Instanz?
Dann könnte es m. E. sein, dass das letzte Statement mehrere Elemente des Arrays entfernt. Wäre interessant, ob removeObjectAtIndex:0 den gleichen Effekt hat.
Mattes ... der mit dieser Idee aber auch fürchterlich daneben liegen kann.
-
Da hat doch die Prauke 'n Loch !
Es sind tatsächlich zwei doppelt, das ist aber kein Fehler meinerseits.
Ich finde das ziemlich eigenmächtig von Cocoa.
Werd' ich die beiden Vertices in einer Schleife löschen.
Danke für den Tip.
UweHow come I can't see me in my mirror ? -
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"? -
Dylans Ghost schrieb:
Ich finde das ziemlich eigenmächtig von Cocoa.
Apple Doku schrieb:
Removes all occurrences in the array of a given object.
„Meine Komplikation hatte eine Komplikation.“ -
Woher soll das Array auch wissen welches Objekt du löschen willst, du übergibst der removeObject Methode ja nur ein Objekt welches es entfernen soll.
Wenn das Objekt nun mehrfach im Array vorkommt und das Array nur eine Instanz davon löschen soll, welche wäre das den dann deiner Meinung nach?
Der erste Treffer?
Der letzte?
Genau deshalb wird das ja explizit in der Doku beschrieben.
Wenn man dein Code in 2 Zeilen aufdröselt wird es dir evtl. klarer:
Die removeMethode bekommt von dem index 0 gar nichts mit.
Ihr wird nur der Rückgabewert der objectAtIndex Methode übergeben.
Sie kann also gar nicht wissen welchen Index du meinst, falls das Objekt mehrfach vorkommt.
Wenn man ein Objekt an einer bestimmten Stelle entfernen will (und nur dort, egal ob das Objekt öfters vorkommt),
dann gibt es ja wie Amin geschrieben hat folgende Lösung:
-
Dylans Ghost schrieb:
Werd' ich die beiden Vertices in einer Schleife löschen.
Was löschst Du jetzt mit einer Schleife?
MattesDiese Seite bleibt aus technischen Gründen unbedruckt. -
MyMattes schrieb:
Dylans Ghost schrieb:
Werd' ich die beiden Vertices in einer Schleife löschen.
Was löschst Du jetzt mit einer Schleife?
Mattes
-
übrignes, es gibt dann auch noch removeObjectIdenticalTo, welches eben nicht auf gleichheit prüft sondern nach identischen objekten (gleiche adresse) sucht.
-
gritsch schrieb:
aber achtung, copy erstellt keine neue instanz bei immutable-objekten (warum auch).
MattesDiese Seite bleibt aus technischen Gründen unbedruckt. -
Ebenfalls wichtig:
[mutableArray removeObject:@"Hallo"];
wirft alle Objekte raus, die gleich (–isEqual:(id)
) sind.
Also auchNSString<0x1234>"Hallo"
undNSString<0x3456>"Hallo"
.
Da hilft–copy
rein gar nix.
Identische Objekte wird man mit-removeObjectIdenticalTo:(id)
los.
Discussion
This method uses the indexOfObjectIdenticalTo: method to locate matches and then removes them by using removeObjectAtIndex:. Thus, matches are determined using object addresses. If the array does not contain anObject, the method has no effect (although it does incur the overhead of searching the contents).
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
Iä-86! Iä-64! Awavauatsh fthagn!
kmr schrieb:
Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Marco Feltmann () aus folgendem Grund: Falsche Methode für Equality Tests
-
MyMattes schrieb:
Oder es ist wirklich das gleiche Objekt (=Instanz), dann macht Cocoa genau das, was es behauptet und der Methodenname aussagt. Wie schon eingangs geschrieben, wäre removeObjectAtIndex: die Alternative.
equalTo:isEqual:
entscheidend.„Meine Komplikation hatte eine Komplikation.“ -
Danke für den Tipp zum Tippfehler.
Ja, auch–objectAtIndex:
geht nach–isEqual:
.
Heißt also, dass@"Hallo"
nicht nur aufNSString<0x1234>"Hallo"
sondern auch aufNSString<0x3456>"Hallo"
anspringt.
In dem Fall ist die Chance also irgendwo bei 50%, dass der Index des falschen@"Hallo
zurückgegeben wird.
Auch hier braucht man dann–indexOfObjectIdenticalTo:
Beispiel (in Swift, weil ein Swift String "Hallo" sich so komplett anders verhält als ein Objective-C String @"Hallo"!)
Quellcode
- import Cocoa
- var allHellos:NSMutableArray = NSMutableArray(capacity: 3)
- allHellos.addObject("Hallo")
- allHellos.addObject("Hallo")
- allHellos.addObject("Hallo")
- print(allHellos.count) // 3; ["Hallo", "Hallo", "Hallo"]
- allHellos.removeObjectIdenticalTo("Hallo")
- print(allHellos.count) // 3; ["Hallo", "Hallo", "Hallo"]
- allHellos.removeObject("Hallo")
- print(allHellos.count)// 0, []
Beispiel in Objective-C
C-Quellcode
- NSMutableArray * allHellos = [NSMutableArray arrayWithCapacity:3];
- [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112200
- [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112310
- [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112370
- NSLog( @"%lu", [allHellos count] ); // 3
- [allHellos removeObjectIdenticalTo:@"Hallo"]; // Speicheradresse: 1080
- NSLog( @"%lu", [allHellos count] ); // 3
- [allHellos removeObject:@"Hallo"];
- NSLog( @"%lu", [allHellos count] ); // 0
Was'n Spagat unterschiedliche Speicheradressen für den selben String zu bekommen…
Hier optimiert Cocoa echt hart…
Quellcode
- NSMutableArray * allHellos = [NSMutableArray arrayWithCapacity:8];
- NSString * hallo = [@"Hallo" mutableCopy];
- [allHellos addObject:@"Hallo"];
- [allHellos addObject:hallo];
- [allHellos addObject:[@"Hallo" mutableCopy]];
- [allHellos addObject:[@"Hallo" mutableCopy]];
- [allHellos addObject:[@"Hallo" mutableCopy]];
- [allHellos addObject:[hallo copy]];
- [allHellos addObject:[hallo copy]];
- [allHellos addObject:[hallo copy]];
- [allHellos enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
- NSLog(@"%ld: %x", idx, obj);
- }];
0: 1090
1: 112210
2: 1122e0
3: 112380
4: 1123e0
5: 6c614855
6: 6c614855
7: 6c614855«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
Iä-86! Iä-64! Awavauatsh fthagn!
kmr schrieb:
Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Marco Feltmann ()
-
Tags