5

isaObjective-C では、メンバー変数に代入することで、実行時にオブジェクトの動的型を変更できます。

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

これは未定義の動作ですか?私は現在、これを他の何かのためのクラッジとして行っており、機能しているように見えますが、この方法で行うのはとても汚いと感じています. 私が設定している新しいクラスはメンバー変数を追加しません。1 つのメソッドをオーバーライドして新しいメソッドを追加するだけなので、クラス サイズは同じです。オブジェクトのサイズを変更すると、非常に悪い結果になる気がします。

4

4 に答える 4

1

Objective-C ランタイムは、これを行う関数を提供するようになりました: object_setClass. ドキュメントにはどのような制限があるかは記載されていませんが、(他の人が述べているように) 元のクラスとまったく同じインスタンス変数レイアウトを持つクラスに新しいクラスを制限したいと思うでしょう。

于 2013-08-28T15:30:53.787 に答える
1

おっしゃる通り汚いと思います。

次の場合に機能すると思われます。

  • 新しく割り当てられたクラスは、実際のクラスのサブクラスです。
  • 新しいクラスはメンバー変数を追加しません。

しかし、Objective-C ランタイム システムの基本的な実装についてはわかりません。私は、実装のために何が理にかなっているのかを知っています。

于 2009-02-17T16:59:03.907 に答える
0

Joshua Weinbergによるこの回答は、これを行う正しい方法を提供します。それは私のために働いた。:)

そして、ダロンは彼の知識に基づいた推測で正しかった:)それが現在のオブジェクトのスーパークラスであり、メンバーを追加しない場合にのみ機能します。

于 2012-01-08T20:34:09.833 に答える
0

これらを変更するのは本当に悪い形式であり、実行時の動作についてあらゆる種類の仮定を行います。クラスを直接変更するメカニズムは提供されていませんが、実行時関数を使用する方がはるかに優れています。

于 2009-02-18T05:05:30.303 に答える