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

  • 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.
    Denke das auch. Scheint die einzig logische Folgerung zu sein
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Eigenmächtig? Du sagt Cocoa, dass es alle Vorkommen des Objektes löschen soll und genau das macht es dann. Zumal dein Code ja etwas von hinten durch die Brust ins Auge geht.

    Schleife? Wieso nicht einfach:

    Quellcode

    1. [animArray removeObjectAtIndex:0];
    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.
    Nein, du hast die Semantik der Methode nicht verstanden: Die entfernt das Objekt aus dem Array, und wenn das gleiche Objekt mehrmals vorkommt, dann werden alle Vorkommen gelöscht. Das steht auch so in der Doku (Hervorhebung von mir):

    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:

    Quellcode

    1. id theObject = [animArray objectAtIndex:0];
    2. [animArray removeObject:theObject];

    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:

    Quellcode

    1. [animArray removeObjectAtIndex:0];
  • Dylans Ghost schrieb:



    Werd' ich die beiden Vertices in einer Schleife löschen.
    Verstehe ich nicht: Entweder es handelt sich um unterschiedliche Objekte gleichen Inhalts, dann solltest Du beim Hinzufügen auch darauf achten (z. B. durch Duplizieren mittels "copy"). 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.

    Was löschst Du jetzt mit einer Schleife?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Dylans Ghost schrieb:

    Werd' ich die beiden Vertices in einer Schleife löschen.
    Verstehe ich nicht: Entweder es handelt sich um unterschiedliche Objekte gleichen Inhalts, dann solltest Du beim Hinzufügen auch darauf achten (z. B. durch Duplizieren mittels "copy"). 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.
    Was löschst Du jetzt mit einer Schleife?

    Mattes
    aber achtung, copy erstellt keine neue instanz bei immutable-objekten (warum auch).
  • Ebenfalls wichtig:
    [mutableArray removeObject:@"Hallo"]; wirft alle Objekte raus, die gleich (–isEqual:(id)) sind.
    Also auch NSString<0x1234>"Hallo" und NSString<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).
    (Auch hier gilt: mehrfach selbe Adresse = mehrere Objekte weg. Soll so.)
    «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

  • Danke für den Tipp zum Tippfehler. :)

    Ja, auch –objectAtIndex: geht nach –isEqual:.

    Heißt also, dass @"Hallo" nicht nur auf NSString<0x1234>"Hallo" sondern auch auf NSString<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

    1. import Cocoa
    2. var allHellos:NSMutableArray = NSMutableArray(capacity: 3)
    3. allHellos.addObject("Hallo")
    4. allHellos.addObject("Hallo")
    5. allHellos.addObject("Hallo")
    6. print(allHellos.count) // 3; ["Hallo", "Hallo", "Hallo"]
    7. allHellos.removeObjectIdenticalTo("Hallo")
    8. print(allHellos.count) // 3; ["Hallo", "Hallo", "Hallo"]
    9. allHellos.removeObject("Hallo")
    10. print(allHellos.count)// 0, []
    Alles anzeigen


    Beispiel in Objective-C

    C-Quellcode

    1. NSMutableArray * allHellos = [NSMutableArray arrayWithCapacity:3];
    2. [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112200
    3. [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112310
    4. [allHellos addObject:[@"Hallo" mutableCopy]]; // Speicheradresse 112370
    5. NSLog( @"%lu", [allHellos count] ); // 3
    6. [allHellos removeObjectIdenticalTo:@"Hallo"]; // Speicheradresse: 1080
    7. NSLog( @"%lu", [allHellos count] ); // 3
    8. [allHellos removeObject:@"Hallo"];
    9. NSLog( @"%lu", [allHellos count] ); // 0
    Alles anzeigen

    Was'n Spagat unterschiedliche Speicheradressen für den selben String zu bekommen…

    Hier optimiert Cocoa echt hart…

    Quellcode

    1. NSMutableArray * allHellos = [NSMutableArray arrayWithCapacity:8];
    2. NSString * hallo = [@"Hallo" mutableCopy];
    3. [allHellos addObject:@"Hallo"];
    4. [allHellos addObject:hallo];
    5. [allHellos addObject:[@"Hallo" mutableCopy]];
    6. [allHellos addObject:[@"Hallo" mutableCopy]];
    7. [allHellos addObject:[@"Hallo" mutableCopy]];
    8. [allHellos addObject:[hallo copy]];
    9. [allHellos addObject:[hallo copy]];
    10. [allHellos addObject:[hallo copy]];
    11. [allHellos enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    12. NSLog(@"%ld: %x", idx, obj);
    13. }];
    Alles anzeigen
    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 ()