RetainCount == 悪い
retainCount
はタブーであり、信頼性が低く、予測不可能であり、一般的に使用すべきではありません。コードのどこにも使用していませんが、興味深い方法で使用している 1 つのクラスで見ました。
スレッドがキャンセルされるまで無期限に実行されるスレッドを実行するクラスがあります。問題は、スレッドが所有者の保持カウントを増やすことです。私の場合は、それをインスタンス化したクラスです。そのため、そのクラスを使い終わったとしても、クラスを管理している誰かがスレッドをシャットダウンすることを知っていない限り、そのインスタンスはまだぶらぶらしています。これは 1 つの解決策ですが、これがコードで見つけたものです。
- (oneway void)release
{
// This override allows allows this object to be dealloced
// by shutting down the thread when the thread holds the last reference.
// Otherwise, the object will never be dealloc'd
if (self.retainCount == 2)
{
[self quitDispatchThread];
}
[super release];
}
これは賢い解決策ですが、どう考えればよいかわかりません。クラスの release をオーバーライドし、retain カウントが 2 かどうかを確認します。つまり、オブジェクトを存続させているのはスレッドだけかどうかを確認します(retain カウントが 2 から 1 に減らされようとしているため)。 ) スレッドを終了します (quitDispatchThread
スレッドが終了するまでブロックします)。
そう...
1 かどうかを確認するために、retainCount を信頼できますか?
retainCount
そこにいくつかの自動リリースがあるかどうかわからないので、通常、人々は近づかないようにと言います。ただし、retainCount が 1 の場合、スレッドだけがそれを維持しているという事実がわかり、自動解放などが原因でretainCount がオフになる可能性があることを心配する必要はありません...
このコードの何が問題になっていますか?
削除しようとしましたが、実際には理にかなっているようです。他のオブジェクトは、私のクラスがスレッドを実行していることを認識する必要はありません。他のオブジェクトretain
や、スレッドを所有しているオブジェクトrelease
でさえもautorelease
、スレッドをシャットダウンすることを心配する必要はありません。
このコードは実際にはすっきりしていて、私は驚いています。
編集 :: NSThread がオブジェクトを保持している
NSThread を使用しているため、オブジェクトの保持カウントが増加しています。私のオブジェクトは でtarget
、selector
はスレッドが実行されるメソッドです。
initWithTarget:セレクター:オブジェクト:
指定された引数で初期化された NSThread オブジェクトを返します。
- (id)initWithTarget:(id)ターゲットセレクター:(SEL)セレクターオブジェクト:(id)引数
パラメーター
目標
selector で指定されたメッセージの送信先オブジェクト。
セレクタ
ターゲットに送信するメッセージのセレクター。このセレクターは引数を 1 つだけ受け取る必要があり、戻り値を持たない必要があります。
口論
ターゲットに渡される単一の引数。ゼロかもしれません。
戻り値
指定された引数で初期化された NSThread オブジェクト。
討論
ガベージ コレクションされていないアプリケーションの場合、メソッド セレクターは、新しく切り離されたスレッドの自動解放プールを設定し、終了する前にそのプールを解放する役割を果たします。ガベージ コレクションされたアプリケーションは、自動解放プールを作成する必要はありません。
オブジェクトのターゲットと引数は、切り離されたスレッドの実行中に保持されます。それらは、スレッドが最終的に終了するときに解放されます。