繁体   English   中英

Objective-C NSThread引用计数约定(保留vs自动释放)

[英]Objective-C NSThread ref counting convention (retain vs autorelease)

我的主程序产生一个线程,执行以下命令:

// 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引用计数约定或协议来处理这种情况(交叉线程等待发布),或者是第二种解决方案,它的工作方式是什么?

实际上, performSelectorOnMainThread保留其参数,直到执行选择器之后 ,因此不需要这样做。

规则很简单; 要将一个对象从线程A传递给线程B,必须存在一个硬保留。 现在,正如文档所述, -performSelectorOnMainThread:和变体) 确实保留对象,直到方法执行完毕,无论是同步调用还是异步调用。

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

并且,要重复,因为它很重要, 自动释放池不能用于跨线程保留对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM