我的主程序生成一个线程,该线程执行以下操作:
// 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 引用计数约定或协议(protocol)来处理这种情况(跨线程 NO-wait 发布),或者是否有第二种解决方案?
最佳答案
实际上,performSelectorOnMainThread
会保留其参数,直到执行选择器之后,因此没有必要这样做。
关于Objective-C NSThread 引用计数约定(保留与自动释放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041375/