2009-02-17 13 views
5

In Objective-C, können Sie ein Objekt der dynamische Typ zur Laufzeit ändern, indem Sie die Zuordnung zu ihm ist isa Membervariable:Ist das Verhalten so definiert, dass die Isa eines Objective-C-Objekts geändert wird?

id object = ...; 
object->isa = [SomeClass class]; 

Ist das nicht definiertes Verhalten? Momentan mache ich das als Klondis für etwas anderes, und es scheint zu funktionieren, aber ich fühle mich so schmutzig, es auf diese Weise zu machen. Die neue Klasse, die ich einstelle, fügt keine Membervariablen hinzu, überschreibt nur eine Methode und fügt eine neue hinzu, so dass die Klassengröße gleich ist. Ich habe das Gefühl, wenn ich die Objektgröße ändere, würde viel Schlechtigkeit resultieren.

+0

möglich Duplikat von [Objective-C: Wie ändere ich die Klasse eines Objekts zur Laufzeit?] (Http://stackoverflow.com/questions/8512793/objective-c-how-to-change-the-class- of-a-object-at-runtime) –

+0

Probleme mit KVO können auftreten. Sie benutzen Isa-Swizzling auch. Mike Ash hat jedoch eine komplette Lösung: http://www.mikeash.com/pyblog/friday-qa-2010-11-19-creating-classes-at-runtime-for-fun-and-profit.html – nielsbot

Antwort

1

Ich denke, das ist, wie Sie sagen, schmutzig.

Ich vermute, es wird funktionieren, wenn:

  • Die neu zugewiesene Klasse eine Unterklasse der Real Klasse.
  • Die neue Klasse fügt keine Membervariablen hinzu.

Aber ich gebe zu, ich weiß nicht die Nüsse-und-Bolzen-Implementierung Ihres Objective-C Laufzeitsystems. Ich weiß nur, was für eine Implementierung Sinn macht.

0

Es ist wirklich schlechte Form, diese zu ändern, und es macht alle möglichen Annahmen über Laufzeitverhalten - Sie sind viel besser dran mit der runtime functions, obwohl sie Ihnen keinen Mechanismus zum direkten Ändern der Klasse bieten.

+0

Ich weiß So funktioniert KVO jedoch – nielsbot

0

This answer von Joshua Weinberg bietet den richtigen Weg, dies zu tun. Es hat für mich funktioniert. :)

Und Darron hatte Recht mit seiner gebildeten Vermutung :) es wird nur funktionieren, wenn es eine Oberklasse des aktuellen Objekts ist, und wenn Sie keine Mitglieder hinzufügen.

1

Die Objective-C-Laufzeit bietet jetzt eine Funktion, um dies zu tun: object_setClass. Die Dokumentation sagt nicht, welche Einschränkungen es gibt, aber (wie andere bereits gesagt haben) stelle ich mir vor, dass Sie die neue Klasse auf eine Klasse mit genau dem Layout der Instanzvariablen als ursprüngliche Klasse beschränken möchten.