Ich versuche Folgendes zu tun:
Das ist mein Versuch:
%Vor%So zu verwenden:
%Vor%Aber die Ergebnisse sind:
Zombie-Objekte deaktiviert:
%Vor%Zombie-Objekte aktiviert (Zeile 11 ist eine EXC_BAD_ACCESS im Bild)
%Vor%Irgendwelche Gedanken darüber, was ich falsch mache?
Nach einiger Zeit habe ich endlich die eigentliche Ursache des Problems gefunden: Ich habe die Signatur des IMP-Typs übersehen. Aus Apples Objective-C-Laufzeitreferenz:
IMP Ein Zeiger auf den Anfang einer Methodenimplementierung.
ID (* IMP) (ID, SEL, ...)
Insbesondere hat IMP einen Rückgabetyp von id und so in ARCLandia ARC versucht, diese ID zu verwalten, was den objc_retain
Absturz verursacht. Angenommen, Sie haben ein IMP in -dealloc
, wenn Sie es explizit an einen C-Funktionszeiger mit dem Rückgabetyp void
übergeben, wird ARC nicht mehr versuchen, den Rückgabewert zu verwalten:
Wenn Sie wirklich wissen möchten, wann ein Objekt freigegeben wird, verwenden Sie zugehörige Objekte.
Verknüpfen Sie ein Objekt speziell mit dem Objekt, das Sie beobachten möchten, sodass das beobachtete Objekt die einzige starke Referenz - die einzige beibehaltene Referenz - auf das Objekt hat. Dann können Sie dealloc
überschreiben und wissen, dass das Objekt, wenn es aufgerufen wird, bereits freigegeben wurde (oder gerade dekonfiguriert wird).
Verwechseln Sie nicht das Objekt, dessen Zuordnung aufgehoben wird !! Es wurden bereits alle dealloc
-Methoden aufgerufen (durch Vererbung), und somit ist der interne Zustand völlig undefiniert .
Beachten Sie, dass wenn Sie versuchen, etwas in den Systemframeworks zu bereinigen, dann ... nicht. Auf diesem Weg ist nichts Instabilität und Schmerz.
Wie ich in den Kommentaren zu nelsbot erwähnt habe, versuche ich NICHT zu wissen wenn ein Objekt freigegeben wird.
Es wäre hilfreich, genau zu wissen, was in Ihrer injected dealloc
-Implementierung ist. Auf den ersten Blick ist der einzige Grund, warum ich denken kann, dass nicht durch die Verwendung von zugeordneten Objekten gelöst werden kann, um die Freigabe aufzudecken, genau weil Sie versuchen, das Verhalten der Klasse% co_de einer Klasse zu ändern %, was wirklich schlecht ist.
Tags und Links objective-c ios cocoa cocoa-touch