ARC: wie benutzerdefinierte Dealloc IMP in Objekt injiziert werden, die wiederum ursprünglichen Dealloc aufruft, ohne Malloc-Fehler zu verursachen

8

Ich versuche Folgendes zu tun:

  1. halte dich an einem class'dealloc IMP
  2. fest
  3. fügt in die Klasse eine benutzerdefinierte IMP ein, die im Wesentlichen das ursprüngliche dealloc IMP
  4. aufruft
  5. Wenn eine Instanz der Klasse freigegeben wird, sollten beide IMPs ausgeführt werden.

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?

    
SaldaVonSchwartz 03.07.2013, 20:37
quelle

2 Antworten

2

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:

%Vor%     
SaldaVonSchwartz 03.07.2013, 21:17
quelle
9

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.

    
bbum 03.07.2013 21:12
quelle

Tags und Links