2

ランタイムを使用して作成されたクラスにゼロ化弱参照(GCではなくARCの意味で)インスタンス変数を追加することは可能ですか?もしそうなら、どのように?

これに関連しているように見えると呼ばれる関数がありますclass_setWeakIvarLayout()が、ドキュメント(この関数と弱くない対応物の両方)は残念ながら非常に薄いです。

4

2 に答える 2

9

コンテナクラスとの連想参照を使用して、ゼロ化弱参照を実現できます。基本的に:

  1. コンテナクラスには、宣言されている単一のivarが含まれています__weak id
  2. 連想参照'setter'は、conatinerを作成__weak idし、オブジェクトを指すようにivarを設定してから、を使用してコンテナーを格納します。objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)
  3. ゲッターはを使用してコンテナーを取得し、 ivarobjc_getAssociatedObject(self, &key)を返します。__weak idオブジェクトがdealloc'edされている場合__weak id ivar、コンテナのはゼロになります。
于 2012-09-05T02:37:34.310 に答える
3

class_setWeakIvarLayout()GCで使用されます。ARCで使用されているかどうかはわかりません。いずれの場合も、任意のインスタンス変数を追加するなど、実行時にクラスのレイアウトを変更することはできません(ただし、最新のランタイムのため、サブクラスを再コンパイルせずにivarをクラスに追加して再コンパイルできます)。

関連するオブジェクトを参照してください。それらはあなたが望むもののほとんど、おそらくすべてを提供します(ゼロ化-弱点が直接サポートされているかどうかはわかりません-そうではなく、別の解決策を見つける必要があります)。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html


ああ-わかりました。説明してくれてありがとう。APIを介してゼロ調整の弱いARC動作を動的に設定できるかどうかはわかりません。ただし、ランタイムとコンパイラのソースは利用可能です。

非ARC環境では、必要なクリーンアップを実行するために-deallocを実装するクラスを設定し、割り当て解除時に上記のクリーンアップをトリガーする必要のあるオブジェクトにインスタンスを関連付け、他にオブジェクトが保持されないようにすることで、ゼロ調整を簡単に偽造できることに注意してください。カスタムの-dealloc通知フックがあります。少し壊れやすいですが、動作します。

于 2012-07-21T18:07:38.830 に答える