私は、マルチキャスト受信機であるQuartz Composer用のカスタムパッチを用意しています。デーモン用のNSThreadを起動し、ユーザーがマルチキャストアドレスまたはポート番号を変更すると、NSThreadを再起動します。NSThreadを割り当ててからスレッドにinitWithTargetを複数回割り当てても安全ですか?
パッチが開始されると、私は新しいスレッドを起動するために次のことを行います。
daemonThread = [NSThread alloc];
その後、私は開始または私はそれを再初期化したスレッドを再起動するたびに好き:私はそれを再起動する前に
[daemonThread initWithTarget:multicastDaemon selector:@selector(doWorkWithDelegate:) object:self];
[daemonThread start];
はもちろん、私はスレッドを毎回終了します。ガベージコレクションは使用していません。パッチが終了するとdaemonThreadをリリースします。
私の心配は、このスレッドを何度も何度も再初期化すると何が起こるのか分かりません。私はInstrumentsがNSThreadとautoreleasepoolを漏らしていると私に伝えました。私はそれがデーモンのスレッドからの私のプールかもしれません。私はプロセスを再起動するたびにこれらの数値が増加することがわかりますが、私はそれが私に何を伝えているかを知るためにInstrumentsに十分に精通していません。
私は心配すべきですか?
スレッドが終了したらどうなりますか?私はこれを行って、スレッドがusleepの直前に呼び出されて終了するメソッドのdidFinishタイプを持つデリゲートを持つようにしました。このメソッドは、スレッドが死んでいることを示すフラグをivarで設定します。次に、次のフレームは、フレームが死んでいることを確認し、上記のようにdaemonThreadを挿入します。それは安全ですか?私は、NSThreadを再起動できないことを理解しています。そのため、私はこれをやってしまいました。それが安全でない場合、安全な選択肢は何ですか? – Adam
@Adam単一のオブジェクトに対してイニシャライザを複数回呼び出すことは決して安全ではありません。期間。 –
安全な方法は、新しいNSThreadを割り当てることです。あなたは、NSThreadがどのリソースをカバーの下で割り当てているのか、 'dealloc'でしかリリースしていないことを知っているので、二度initするとリークします。また、あなたがそれを使用している場合は、ARCを台無しにするかもしれません。 "[同じオブジェクト上のinitメソッドへの2つ以上の呼び出しを引き起こすプログラムの定義されていない動作ですが、各initメソッドの呼び出しは多くとも1つのdelegate init呼び出しを実行できます。](http://clang.llvm.org/ docs/AutomaticReferenceCounting.html#family.semantics.init) " –