Objective-C: Wie ändere ich die Klasse eines Objekts zur Laufzeit?

8

Ich habe versucht, eine UITableView-Unterklasse mit einem UITableViewController zu verwenden mit ISA Switching wie folgt:

%Vor%

Aber ich bekomme den Kompilierfehler: Instance variable 'isa' is protected.

Gibt es eine Möglichkeit, dies zu umgehen? Und wenn ja, ist es sicher zu tun?

Ich frage, weil @ AmberStars Antwort auf diese Frage etwas fehlerhaft scheint. (Siehe meinen Kommentar.)

    
ma11hew28 14.12.2011, 22:42
quelle

2 Antworten

22

Wenn Ihre Tableview-Klasse ANY-Speicher zur Verfügung stellt, wird dies abgebrochen. Ich würde den Weg, den du durchführst, nicht empfehlen. Aber die korrekte Methode wäre, object_setClass(tableView, [MyTableView class]) zu verwenden.

Bitte stellen Sie sicher, dass dies wirklich das ist, was Sie wollen.

Hier ist ein kleines Codebeispiel, das zeigt, wie das eine schreckliche Idee ist.

%Vor%

und die Ausgabe

%Vor%

Wie Sie sehen können, schrieb das Schreiben in storage->c außerhalb des Speichers, der für die Instanz zugewiesen wurde, und in den Block, den ich für den Zufall zugewiesen habe. Wenn das ein anderes Objekt war, haben Sie gerade den isa Zeiger gelöscht.

    
Joshua Weinberg 14.12.2011, 22:45
quelle
5

Der sichere Weg besteht darin, eine neue Instanz zu erstellen.

Das Tauschen von isa ist nicht sicher - Sie haben keine Ahnung, wie das Speicherlayout einer Klasse aussieht oder wie es in Zukunft aussehen wird. Selbst das Verschieben des Vererbungsgraphen ist wirklich nicht sicher, da die Initialisierung und Zerstörung von Objekten nicht korrekt durchgeführt werden würde - Ihr Objekt in einem möglicherweise ungültigen Zustand belassen würde (was Ihr gesamtes Programm zum Absturz bringen könnte).

    
justin 14.12.2011 22:47
quelle