Hallo,
eine OSX App zeigt per [NSApp beginSheet:...] ein Sheet mit Einstellungen. Der zugehörige ViewController verwendet hierfür eine Eine NSTableView die eine eigene Unterklasse von NSView als Inhalt für die Zeilen verwendet:
Alles anzeigen
Problem 1:
Wir das Sheet geschlossen wird dieses animiert ausgeblendet. Scheinbar werden schon während dieser Animation der ViewController und damit auch der "RowHandler" (der Delegate der MyTableRowViews) freigegeben). Befindet sich die Maus in dem Bereich über dem VC reagieren die MyTableRowViews dennoch weiter auf mouseEntered: Wird dort auf den bereits freigegebenen Delegate zugegriffen kommt es zum EXC_BAD_ACCESS und die App crashed entsprechend.
Die neue Version der App läuft nur noch auf 10.7+. Dieses Problem konnte ich beheben in dem ich den Delegate statt als unsafe_unretained als weak definiert habe:
Während unsafe_unretained ungültigen Speicher zurück lässt, setzt weak das Ganze auf NIL, der Zugriff auf das freigegebene Objekt ist also unproblematisch. Ist das die richtige Lösung oder macht man das anders?
Problem 2:
Durch die Änderung des Delegate crashed die App nicht mehr beim Zugriff auf diesen. Dafür kommt es jetzt zum EXC_BAD_ACCESS beim Zugriff auf [self nextResponder]. Wie kann ich das vermeiden/lösen?
Vielen Dank!
eine OSX App zeigt per [NSApp beginSheet:...] ein Sheet mit Einstellungen. Der zugehörige ViewController verwendet hierfür eine Eine NSTableView die eine eigene Unterklasse von NSView als Inhalt für die Zeilen verwendet:
Quellcode
- // MyTableRowView.h
- ...
- @property (nonatomic, unsafe_unretained) NSObject <MyTableRowViewDelegate> *delegate;
- // MyTableRowView.m
- ...
- - (void)mouseEntered:(NSEvent *)theEvent {
- if ([self.delegate respondsToSelector:@selector(mouseEnteredRow:)])
- [self.delegate mouseEnteredRow:self];
- [[self nextResponder] mouseEntered:theEvent];
- }
Problem 1:
Wir das Sheet geschlossen wird dieses animiert ausgeblendet. Scheinbar werden schon während dieser Animation der ViewController und damit auch der "RowHandler" (der Delegate der MyTableRowViews) freigegeben). Befindet sich die Maus in dem Bereich über dem VC reagieren die MyTableRowViews dennoch weiter auf mouseEntered: Wird dort auf den bereits freigegebenen Delegate zugegriffen kommt es zum EXC_BAD_ACCESS und die App crashed entsprechend.
Die neue Version der App läuft nur noch auf 10.7+. Dieses Problem konnte ich beheben in dem ich den Delegate statt als unsafe_unretained als weak definiert habe:
Während unsafe_unretained ungültigen Speicher zurück lässt, setzt weak das Ganze auf NIL, der Zugriff auf das freigegebene Objekt ist also unproblematisch. Ist das die richtige Lösung oder macht man das anders?
Problem 2:
Durch die Änderung des Delegate crashed die App nicht mehr beim Zugriff auf diesen. Dafür kommt es jetzt zum EXC_BAD_ACCESS beim Zugriff auf [self nextResponder]. Wie kann ich das vermeiden/lösen?
Vielen Dank!