Gelgentliche Crashes bei NSInvocation und isa-swizzling

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

  • Gelgentliche Crashes bei NSInvocation und isa-swizzling

    Hi,

    ich verwende isa-swizzling, um einer gegebenen Instanz eines Objektes temporär ein eine neue Klasse zu verpassen. Konkret biege ich das touch-Handling eines UIView um. (Anmerkung: Das ist nicht die Frage.)

    Nun bekomme ich hin und wieder und nicht repdroduzierbar folgenden Fehler, wenn ich mit einer NSInvocation innerhalb der überschriebenen touches-Methoden die Handling-Methode des ViewControllers (ist eine auch im Crash-Zeitpounkt valide und gesetzt Property) aufrufe:

    Quellcode

    1. 'NSInvalidArgumentException', reason: '+[NSInvocation _invocationWithMethodSignature:frame:]: method signature argument cannot be nil'


    Das Zufällige an der ganzen Sache ergibt für mich keinen Sinn. Die Methode, für die ich einen Selektor bilde, gibt es. Ich habe auch keinen Schreibfehler gemacht (sonst würde es ja auch immer crashen).

    Was mache ich nur falsch ...?
  • Ich bin mir inzwischen relativ sicher, dass ich einen Denkfehler gemacht habe: ist es überhaupt möglich, dass ich, wenn ich die Klasse eines Objektes swizzle, zusätzliche Properties und ivars verwende? Der Speicher muss ja irgendwo herkommen ... das ursprünglich Objekt hat ihn ja nicht.

    Ich habe de Property jetzt weg geworfen und durch ein assoziiertes Objekt ersetzt. Vielleicht ist das stabiler.
  • Uiuiuiui. Da rollen sich die Fußnägel hoch... Also solche Software möchte ich nicht pflegen oder begutachten müssen :) Und die "Belohnung" durch gelegentliche Crashes ist völlig gerechtfertigt...

    Mit dem Denkfehler bzgl. iVars hast Du recht.

    Was willst Du überhaupt erreichen? Einem von irgendwoher gegebenen Objekte zusätzliche Properties verpassen? Der Wunsch ist valide.
    Eine saubere Lösung geht über ein Dict das eine Assoziation vom gegebenen Objekt zu seinen Zusatzproperties (Ergänzungsklasse) herstellt.

    Oder wenn Du das Touch-Handling überschreiben willst, dann gibt es dafür Categories. Oder baue einen Decorator: de.wikipedia.org/wiki/Decorator