12

を使用していくつかのオブジェクトのクラスを変更していますobject_setClass(id object, Class cls)クラスを元のクラスのサブクラスに変更しています。次に、サブクラスでのみ定義されているいくつかのプロパティを設定しましたが、問題なく動作しているようです。

object_setClass私が理解している限り、オブジェクトを再割り当てせず、isaポインタを変更するだけなので、これが機能することに少し驚きました。サブクラスインスタンスが元のクラスインスタンスよりもかなり大きい場合(つまり、より多くのivarがある場合)、オブジェクトが期待どおりに機能する方法がわかりません。

これは、メモリ内のオブジェクト間に大量のバッファメモリがあるためにのみ機能しますか(配置などのため)?

これは堅牢ですか、それとも特定の状況でクラッシュする可能性がありますか?

4

2 に答える 2

7

クラッシュする可能性があります。ここのランタイムのソースコードに見られるように、それは実際にはisaポインタを交換するだけです。

より多くのivarを持つサブクラスのに本当にスワップしたい場合は、ゼロ以外で使用する必要isaがあります。isaclass_createInstanceextraBytes

于 2010-07-27T18:15:47.453 に答える
3

より大きなサブクラスを使用する代わりに、objc_setAssociatedObjectおよびを使用objc_getAssociatedObjectして、既存の固定サイズのオブジェクトに動的に追加のオブジェクトをアタッチします。

于 2013-08-24T23:03:03.327 に答える