Servus.
Ich woll euch mal von einer sehr komischen Erfahrung berichen, die ich letztens gemacht hab:
Aus speziellen Gründen war ich gezwungen, ein paar interne Klassen aus dem AppKit Framework zu erweitern. Vielleicht kennt sich ja einer mit dem undo des Textsystems aus, das waren konkret NSUndoTextOperation, NSUndoReplaceCharacters, NSUndoTyping und NSUndoSetAttributes. Ich hab diese Klassen also abgeleitet und hann mit poseAsClass: die Subclasses dazwischen geschoben.
Das hat auch alles ganz wunderbar geklappt, allerings: es gab absolut willkürliche crashes in unterschiedlichen zeitlichen Abständen an absolut willkürlichen Orten (z.B. im erstellen eines Dicts, laden eines nibs, zeichnen eines views usw), und zwar immer beim alloziieren von Speicher. Ich hab alles versucht, bin erst nicht drauf gekommen, dass es mit dem Posen zu tun haben könnte und so weiter.
Nach unendlich viel Zeit (3 Wochen oder so) hab ich's dann durch Zufall rausgefunden: Es lag daran, dass ich von den Klassen, die ich überschrieben hatte nur die Funktionen in mein Interface geschrieben habe und nicht auch noch die Variablen. Hier mal n kleines snippet, erst halt ohne die Variablen:
Alles anzeigen
Es müssen also im *Interface* alle Variablen der zu überposenden klasse bekannt sein. Dass man keine hinzufügen kann ist mir klar, aber vielleicht kann mir einer der Obj-C geeks sagen, warum die bekannt sein müssen? Wird die größe der Klasse nicht zu Laufzeit, sondern schon beim Compilieren ermittelt?
grüße,
Max
Ich woll euch mal von einer sehr komischen Erfahrung berichen, die ich letztens gemacht hab:
Aus speziellen Gründen war ich gezwungen, ein paar interne Klassen aus dem AppKit Framework zu erweitern. Vielleicht kennt sich ja einer mit dem undo des Textsystems aus, das waren konkret NSUndoTextOperation, NSUndoReplaceCharacters, NSUndoTyping und NSUndoSetAttributes. Ich hab diese Klassen also abgeleitet und hann mit poseAsClass: die Subclasses dazwischen geschoben.
Das hat auch alles ganz wunderbar geklappt, allerings: es gab absolut willkürliche crashes in unterschiedlichen zeitlichen Abständen an absolut willkürlichen Orten (z.B. im erstellen eines Dicts, laden eines nibs, zeichnen eines views usw), und zwar immer beim alloziieren von Speicher. Ich hab alles versucht, bin erst nicht drauf gekommen, dass es mit dem Posen zu tun haben könnte und so weiter.
Nach unendlich viel Zeit (3 Wochen oder so) hab ich's dann durch Zufall rausgefunden: Es lag daran, dass ich von den Klassen, die ich überschrieben hatte nur die Funktionen in mein Interface geschrieben habe und nicht auch noch die Variablen. Hier mal n kleines snippet, erst halt ohne die Variablen:
Quellcode
- @interface NSUndoTextOperation : NSObject
- {
- struct _NSRange _affectedRange;
- NSUndoManager *_undoManager;
- NSLayoutManager *_layoutManager;
- }
- - (id)initWithAffectedRange:(NSRange)affectedRange layoutManager:(NSLayoutManager *)layoutManager undoManager:(NSUndoManager *)undoManager;
- - (void)undoRedo:(id)sender;
- - (NSTextView *)firstTextViewForTextStorage:(NSTextStorage *)storage;
- - (NSUndoManager *)undoManager;
- - (BOOL)isSupportingCoalescing;
- @end
- @interface _NSUndoTextOperation : NSUndoTextOperation
- @end
Es müssen also im *Interface* alle Variablen der zu überposenden klasse bekannt sein. Dass man keine hinzufügen kann ist mir klar, aber vielleicht kann mir einer der Obj-C geeks sagen, warum die bekannt sein müssen? Wird die größe der Klasse nicht zu Laufzeit, sondern schon beim Compilieren ermittelt?
grüße,
Max
Also war die einzige Möglichkeit, sich in die internen Methoden der internen Klassen zu hängen und die falschen informationen zu korrigieren. Hat ne weile gedauert, bis ichs gefunden hatte, aber jetzt ist's super-einfach: