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:
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:
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 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 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
- -(void) onSelectorActivated
- {
- CCLOG(@"selector activated");
- // when the selector was activated, set it back to move mode
- self.inputProcessingMode = kMoveSelector;
- if (self.activeMenuObject != nil)
- {
- // at this point the index of the chosen item is already determined.
- // now let's send the activation message to the item.
- [[self.activeMenuObject.menuItems objectAtIndex:self.selectionIndex] onClick:self]; // <- um die zeile gehts
- }
- }
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
- @interface TCMenuObject : CCLayer {
- int maxMenuItems;
- int menuItemsCount;
- TCMenuItem* selectedItem;
- BOOL canScroll;
- id parentMenu;
- int perItemHeight;
- NSMutableArray* menuItems;
- }
- @property (readonly, assign) int maxMenuItems;
- @property (readonly, assign) int menuItemsCount;
- @property (readonly, nonatomic) NSMutableArray* menuItems;
- @property (readwrite, retain) TCMenuItem* selectedItem;
- @property (readonly, assign) BOOL canScroll;
- @property (readwrite, retain) id parentMenu;
- @property (readonly, assign) int perItemHeight;
- // und im Implementations-Teil steht dann:
- @implementation TCMenuObject
- @synthesize maxMenuItems, menuItemsCount, menuItems, selectedItem, canScroll, parentMenu, perItemHeight;
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 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.