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

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

最佳答案

实际上,在 选择器执行之后,performSelectorOnMainThread 会保留其参数直到 ,所以没有必要这样做。

关于Objective-C NSThread 引用计数约定(保留与自动释放),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2041375/

10-09 16:25