ランタイムを使用して作成されたクラスにゼロ化弱参照(GCではなくARCの意味で)インスタンス変数を追加することは可能ですか?もしそうなら、どのように?
これに関連しているように見えると呼ばれる関数がありますclass_setWeakIvarLayout()
が、ドキュメント(この関数と弱くない対応物の両方)は残念ながら非常に薄いです。
ランタイムを使用して作成されたクラスにゼロ化弱参照(GCではなくARCの意味で)インスタンス変数を追加することは可能ですか?もしそうなら、どのように?
これに関連しているように見えると呼ばれる関数がありますclass_setWeakIvarLayout()
が、ドキュメント(この関数と弱くない対応物の両方)は残念ながら非常に薄いです。
コンテナクラスとの連想参照を使用して、ゼロ化弱参照を実現できます。基本的に:
__weak id
__weak id
し、オブジェクトを指すようにivarを設定してから、を使用してコンテナーを格納します。objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)
objc_getAssociatedObject(self, &key)
を返します。__weak id
オブジェクトがdealloc
'edされている場合__weak id ivar
、コンテナのはゼロになります。class_setWeakIvarLayout()
GCで使用されます。ARCで使用されているかどうかはわかりません。いずれの場合も、任意のインスタンス変数を追加するなど、実行時にクラスのレイアウトを変更することはできません(ただし、最新のランタイムのため、サブクラスを再コンパイルせずにivarをクラスに追加して再コンパイルできます)。
関連するオブジェクトを参照してください。それらはあなたが望むもののほとんど、おそらくすべてを提供します(ゼロ化-弱点が直接サポートされているかどうかはわかりません-そうではなく、別の解決策を見つける必要があります)。
ああ-わかりました。説明してくれてありがとう。APIを介してゼロ調整の弱いARC動作を動的に設定できるかどうかはわかりません。ただし、ランタイムとコンパイラのソースは利用可能です。
非ARC環境では、必要なクリーンアップを実行するために-deallocを実装するクラスを設定し、割り当て解除時に上記のクリーンアップをトリガーする必要のあるオブジェクトにインスタンスを関連付け、他にオブジェクトが保持されないようにすることで、ゼロ調整を簡単に偽造できることに注意してください。カスタムの-dealloc通知フックがあります。少し壊れやすいですが、動作します。