我的主程序产生一个线程,执行以下命令:
// 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引用计数约定或协议来处理这种情况(交叉线程等待发布),或者是第二种解决方案高于它的方式?
答案 0 :(得分:9)
实际上,performSelectorOnMainThread
会保留其参数,直到执行选择器后 ,因此无需执行此操作。
答案 1 :(得分:3)
规则很简单;要将一个对象从线程A传递给线程B,必须存在一个硬保留。现在,正如文档所述,-performSelectorOnMainThread:
(和变体)执行保留对象,直到方法执行完毕,无论是同步调用还是异步调用。
然而,通常明智的做法是维护一个发送保留线程,即接收线程主题。它意图明确,并将支持未来的重构,可能会支持不进行自动保留/释放的其他模型。
并且,要重复,因为它很重要,自动释放池不能用于跨线程保留对象。