私のメインプログラムは、以下を実行するスレッドを生成します。
// alloc autorelease pool somewhere before
NSArray *blah = [NSArray arrayWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
waitUntilDone: NO];
// release autorelease pool somewhere after
セレクターboonk:の実行が終了する前に自動解放プールが解放される可能性があるため、これはバグのように思えます。これにより、クラッシュが発生します。
だから、私の自然な次の動きは次のようになります:
// alloc autorelease pool somewhere before
NSArray *blah = [[NSArray alloc] initWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
waitUntilDone: NO];
// release autorelease pool somewhere after
- (void)boonk: (id)data
{
// do something with data
[data release]; // release the ref count the thread added
}
これは間違いなくバグがありませんが、....不自然に思えます。この状況を処理するためのObjective-Cの参照カウント規則またはプロトコル(クロススレッドNO-投稿待ち)はありますか、それともそれが行われる方法の上の2番目の解決策ですか?