3

我的主程序产生一个线程,它执行以下操作:

// 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 ref 计数约定或协议来处理这种情况(跨线程无等待发布),或者第二个解决方案是否高于它的完成方式?

4

2 回答 2

9

实际上,performSelectorOnMainThread执行选择器之前保留其参数,因此无需这样做。

于 2010-01-11T11:08:39.040 回答
3

规则很简单;要将对象从线程 A 传递到线程 B,必须存在硬保留。现在,如文档所述,-performSelectorOnMainThread:(和变体)确实保留对象,直到方法完成执行,而不管同步或异步调用如何。

但是,维护一个在发送线程时保留在接收线程时释放的主题通常是明智的。它的意图是明确的,并将支持未来的重构,可能会支持执行自动保留/释放的其他模型。

而且,重复一遍,因为它很重要,不能使用自动释放池来跨线程保留对象。

于 2010-01-11T18:46:36.453 回答