ストレージ メモリ割り当てのバグを追跡しようとしていたので、クラスの保持メソッドと解放メソッドをオーバーライドしました。このクラスのインスタンスを別のプロパティに割り当てると、オブジェクトの保持カウントが増加することに気付きましたが、再定義した保持は呼び出されませんでした。
これはどのように可能ですか?保持を呼び出さずにオブジェクトを保持する (保持する) プロパティはありますか?
ストレージ メモリ割り当てのバグを追跡しようとしていたので、クラスの保持メソッドと解放メソッドをオーバーライドしました。このクラスのインスタンスを別のプロパティに割り当てると、オブジェクトの保持カウントが増加することに気付きましたが、再定義した保持は呼び出されませんでした。
これはどのように可能ですか?保持を呼び出さずにオブジェクトを保持する (保持する) プロパティはありますか?
私のマシンでは、オーバーライドされたものretain
が呼び出されました。(私は 10.6.4 を使用しています。これは GCC 4.2.1 と clang 1.5 の両方で確認しました。) コードを投稿していただけますか?
内部的には、retain
プロパティの合成されたセッターは を使用します。objc_setProperty
そのソース コードはこちらから入手できます。ご覧のとおり、最終的に[newObject retain]
はプロパティが を使用するときに呼び出されますretain
。
self (self. yourproperty ) を使用しない場合、保持カウントは増加しません。
ガベージ コレクションはオンになっていますか? retain
GCで呼び出されるとは思わない。
合成されたプロパティが保持または解放を呼び出さずに保持カウントを変更しても、私は驚かないでしょう。