NSMutableArray als Property und Frage zu Touch Eingaben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSMutableArray als Property und Frage zu Touch Eingaben

    Hallo!
    Ich habe mal wieder ein Problem, bei dem ich nicht weiß wo ich nachlesen kann wie ich es löse.
    Ich versuche gerade das Hauptmenü meines iPhone Spiels zu basteln. Dafür hab ich ein Hauptobjekt erstellt, das dann einzelne Seiten des Menüs referenzieren soll, die jeweils ein NSMutable Array haben in dem Menüpunkte als Objekte stecken. Die Touch eingaben werden aus der Hauptszene (ich verwende die Cocos2D Engine) an mein Hauptobjekt weitergeleitet und dort werden die Eingaben dann behandelt. Meine Klassen heißen TCMainMenu, TCMenuObject und TCMenuItem.
    Erstmal kurz meine Touch Frage: kann ich einen Touch "abbrechen", also erzwingen dass vom aktuellen touch keine Eingaben mehr kommen bis man den Finger neu aufgesetzt hat? Oder muss ich da einfach selbst dafür sorgen das die Eingaben bis zum neu Aufsetzen des Finger ignoriert werden? Ich tippe mal auf letzteres, aber es hätte mich interessiert obs anders Geht.
    Nun das kompliziertere Problem. In TCMainMenu habe ich diesen Aufruf:


    Quellcode

    1. -(void) onSelectorActivated
    2. {
    3. CCLOG(@"selector activated");
    4. // when the selector was activated, set it back to move mode
    5. self.inputProcessingMode = kMoveSelector;
    6. if (self.activeMenuObject != nil)
    7. {
    8. // at this point the index of the chosen item is already determined.
    9. // now let's send the activation message to the item.
    10. [[self.activeMenuObject.menuItems objectAtIndex:self.selectionIndex] onClick:self]; // <- um die zeile gehts
    11. }
    12. }
    Alles anzeigen


    Ich möchte an der markierten Stelle vom MainMenu aus das aktive MenuObect aus einer Property auslesen, auf dessen property menuItems zugreifen, wohinter sich ein NSMutableArray verbirgt, über den in einer property gespeicherten selectionIndex das richtige MenuItem Objekt aus dem Array auswählen und dem dann die Nachricht schicken, dass es angeklickt wurde.
    Und irgendwie ist mir mein Programm immer abgestürzt, wenn ich auf dieses Array an dieser Stelle aus zugegriffen hab. Dann hab ich gedacht ich hätte die Einstellungen zum synthetisieren der Property falsch gemacht und hab daran was verändert, und jetzt geht es. Aber ich konnte de Zustand wo es immer abgestürzt ist nicht mehr reproduzieren, daher glaube ich, ich hab da was gravierend wichtiges nicht verstanden und sollte etwas bestimmtes nachlesen. Ich weiß nur nicht was und wo.

    Hier die Property Deklaration aus dem MenuObject:

    Quellcode

    1. @interface TCMenuObject : CCLayer {
    2. int maxMenuItems;
    3. int menuItemsCount;
    4. TCMenuItem* selectedItem;
    5. BOOL canScroll;
    6. id parentMenu;
    7. int perItemHeight;
    8. NSMutableArray* menuItems;
    9. }
    10. @property (readonly, assign) int maxMenuItems;
    11. @property (readonly, assign) int menuItemsCount;
    12. @property (readonly, nonatomic) NSMutableArray* menuItems;
    13. @property (readwrite, retain) TCMenuItem* selectedItem;
    14. @property (readonly, assign) BOOL canScroll;
    15. @property (readwrite, retain) id parentMenu;
    16. @property (readonly, assign) int perItemHeight;
    17. // und im Implementations-Teil steht dann:
    18. @implementation TCMenuObject
    19. @synthesize maxMenuItems, menuItemsCount, menuItems, selectedItem, canScroll, parentMenu, perItemHeight;
    Alles anzeigen


    Ich zeig euch direkt mal alle Properties, da ist bestimmt noch mehr falsch. Vor allem mit Arrays in Propertys hab ich immer wieder Probleme. Auf die Lösung mit (readonly,nonatomic) bin ich durch einen Foreneintrag gekommen. Ich hoffe wenigstens das ist richtig. Das Array selbst soll von anderen Objekten zur Laufzeit nur verändert werden, es wird nicht vorkommen, dass das ganze Array getauscht wird. Initialisiert wirds im init meines Objektes und im dealloc wirds später dann abgeräumt. Da ich nicht weiß wie ich etwas Multi-threaded programmiere gehe ich mal davon aus, das ich das auch nicht gemacht hab :D und nonatomic auch richtig ist. Oder?
    SelectedItem brauch ich momentan noch gar nicht, aber da soll dann später mal ein Verweis auf das ausgewählte MenuItem rein. Das Item bleibt weiter in dem Array verpackt. Wahrscheinlich brauch ich das auch nie, aber mal des Verständnis halbers, ist hier (readwrite, retain) richtig?
    Die Zeile "@property (readwrite, retain) id parentMenu;" ist für eine Referenz zurück auf mein MainMenu Objekt gedacht. Baue ich damit eventuell einen Referenz Zyklus der später beim Abräumen Probleme machen wird? Ich glaub fast da müsste assign statt retain hin. Und sollte ich statt "id" besser "TCMainMenu*" verwenden, weil da ja nie was anderes rein soll und ich dann problemloser Nachrichten an das Objekt schicken kann? Wo genau der Unterschied zwischen id und dem "spezielleren" pointer ist, hab ich noch nicht richtig verstanden. Wenn ich id nehme und eine Nachricht an das Objekt schicken will, geht das dann nicht über [object.idProperty message]; sondern nur über [self performSelector:@selector(message)]; ?

    Ich hab das Buch "Objective-C und Cocoa" von Amin (2. Auflage) aus der Bücherei entliehen und habe darin schon etwas über reference counting und Properties allgemein gelesen. Aber ganz speziell zu meinem Problem mit dem Array als Property hab ich nichts entdeckt. Für einen Hinweis auf die entsprechenden Seiten und natürlich auch jede sonstige Hilfe wär ich euch sehr dankbar. :)
  • Ich habe den Beitrag jetzt nicht ganz gelesen, aber:

    1. Du findest etwas über die Speicherverwaltung von Collections, auch wenn sie als Property fungieren.

    2. Du verwendest bitte nie eine Mutable-Collection als Typ einer Property, jedenfalls nicht öffentlich. Dazu findest du Ausführungen bei Key-Value-Coding.

    3. Huup Holland!
    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"?
  • @Amin: Vielen Dank für die schnelle Antwort, und natürlich fürs Buch-schreiben, wo ich das jetzt nachlesen kann ;).

    1. Meinst du im Kapitel über Collections? Das muss ich noch lesen, mach ich bald mal.

    2. Das Kapitel über KVC hab ich von S.420 bis S.440 gelesen. Da war schonmal viel aufschlussreiches drin. Ich hab jetzt das NSMutableArray nicht mehr als Property angesprochen, sondern Funktionen geschrieben mit denen man das Objekt dazu bringen kann die gewünschten Werte aus dem Array zu lesen und auszugeben oder neue ins Array zu packen. Die sind jetzt sicher noch nicht KVC compliant, aber es funktioniert und stürzt nix ab. Mir ist dabei eingefallen das ich das früher mal als "Workaround" gemacht hab. Aber es scheint ja ansich doch der bessere Stil zu sein für alles mögliche Funktionen zu schreiben, statt Properties so viel wie möglich zu benutzen?! Stimmt das? Man ließt da irgendwie auch unterschiedliche Sachen. In nem Forum hab ich auch mal gelesen man sollte Dot-Syntax möglichst vermeiden und Instanzvariablen nur In Accessoren, im init und im dealloc benutzen. Ok, letzteres macht wahrscheinlich wirklich Sinn. Gibt es irgendwo eine "knappe" Zusammenfassung von solchen Faustregeln, oder gibts dafür zu viele verschiedene Ansichten?
    Du schreibst auf S. 433 "Was Sie jedoch auf keinen Fall tun dürfen, ist, eine Mutable-Collection als Instanzvariable zu verwenden und diese dann unmittelbar zu verändern. Dies führt dazu, dass die anderen hier besprochenen Cocoa-Technologien nicht mehr funktionieren! Zumindest muss am Ende ein Aufruf eines Setters erfolgen."
    Das versteh ich ehrlichgesagt nicht. Warum funktioniert was genau wann nicht? :rolleyes:
    Und noch etwas hat mich irritiert. Schau dir Bitte mal das Codebeispiel zu KVC auf S. 424 oben an. In der 4. Zeile vom Codebeispiel steht fragst du else if ([value isEqualToString:@"lastname"]) ab. Müsste da nicht auch "key" abgefragt werden?! Ich will nicht klugscheißen, ich versteh nur nicht warum da einmal key und einmal value in dem Beispiel benutzt werden.

    3. Holland?! Fährst du in den Urlaub? Falls ja, schönen Urlaub und erhol dich gut! Hast ihn dir sicher verdient :). Ich mach jetzt auch 2 Wochen Urlaub, auf Balkonien...
  • Ok, letzteres macht wahrscheinlich wirklich Sinn. Gibt es irgendwo eine
    "knappe" Zusammenfassung von solchen Faustregeln, oder gibts dafür zu
    viele verschiedene Ansichten?
    Ich les grad das OOP_ObjC.pdf von Apple. Damit hat sich die Frage wann Propertys oder eigene Accessoren gut sind im Grunde geklärt und ich versteh jetzt auch warum ich keine Arrays als Property anlegen sollte :).
  • MartinH. schrieb:

    Ok, letzteres macht wahrscheinlich wirklich Sinn. Gibt es irgendwo eine
    "knappe" Zusammenfassung von solchen Faustregeln, oder gibts dafür zu
    viele verschiedene Ansichten?
    Ich les grad das OOP_ObjC.pdf von Apple. Damit hat sich die Frage wann Propertys oder eigene Accessoren gut sind im Grunde geklärt und ich versteh jetzt auch warum ich keine Arrays als Property anlegen sollte :).

    Arrays gehen schon, bloß keine Mutable-Arrays.
    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"?