我应该发布我创建的NSThread吗?

问题描述:

我很可能会推翻这一点。我应该发布我创建的NSThread吗?

// Inside some method... 
NSThread *thread = [[NSThread alloc] initWithTarget:functionWrapper selector:@selector(run) object:nil]; 
[thread start]; 

调用此之后[thread release]:A.避免了内存泄漏是必要或... B.将打破东西。

this question的回答表明线程在完成执行时将自行释放,但该行为在何处记录?

+0

它在这里https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – onmyway133 2013-03-07 12:09:04

是的,你将不得不在一段时间后释放它,无论是通过自动释放还是释放。

但是,你并不真正需要初始化自己的线程摆在首位,Objective-C中有很多方法让你实现线程不allocing一个新的线程自己,像

[self performSelectorInBackground:@selector(yourMethod) withObject:nil]; 

有也是NSOperations,允许你排队你的任务。

+0

让我看看我能否做到这一点。看着别人的代码,他们正在跳过一些可能不需要的篮球。 – 2012-07-17 01:20:55

+0

,别忘了GCD。 (看到这个http://stackoverflow.com/q/5502906/210171) – nielsbot 2012-07-17 01:29:33

+0

感谢您的背景建议,它工作得很好!如果我可以从头开始,我们可能会使用GCD。 – 2012-07-17 01:30:37

作为一般规则:如果您调用对象上的alloc,new或copy,则必须将其释放。

一旦该线程的生命周期完成(或在您的dealloc函数中),请致电[thread release]

与你链接的答案的区别,你会看到他在字符串的末尾有自动释放(autoreleasing是上述规则不适用的实例,在这些情况下,对象将自动在当前主运行循环的结束,以便它在整个当前范围内保持活动状态)。

+0

我认为autoreleasing只是保持内存,直到下一次执行过程自动释放池。它实际上并没有引用计数的权利 - 这将是垃圾收集。 – 2012-07-17 01:12:38

+2

@BenFlynn自动释放意味着对象的保留计数将在它所在的自动释放池的下一个流失中减1。如果它在此之前没有被其他任何东西保留,它将被释放。如上所述,将对象设置为零没有关系。自动释放与答案中的大胆字母规则释放相同(这只是一个延迟释放)。 – borrrden 2012-07-17 01:45:39

+1

@BenFlynn正确,正如我详细阐述的那样,我错误地认为自动排水池排水的本质。编辑我的答案是为了不传播错误信息! – andycam 2012-07-17 02:01:48