【问题标题】:Should I release the NSThread I create?我应该释放我创建的 NSThread 吗?
【发布时间】:2012-07-17 01:05:26
【问题描述】:

我可能想多了。

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

在此之后调用[thread release]:A. 避免内存泄漏并且是必要的,或者... B. 会破坏事情。

this question 的答案表明线程在完成执行后会自行释放,但该行为记录在哪里?

【问题讨论】:

标签: objective-c ios memory-management


【解决方案1】:

是的,您必须稍后通过自动释放或释放来释放它。

但是,您实际上并不需要一开始就初始化自己的线程,objective-c 有很多方法可以让您实现线程,而无需自己分配新线程,例如

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

还有一些 NSOperations 也允许您将任务排队。

【讨论】:

  • 让我看看我能不能做到。查看其他人的代码,他们正在跳过一些可能没有必要的障碍。
  • 感谢您的后台建议,效果很好!如果我可以从头开始,我们可能会使用 GCD。
【解决方案2】:

作为一般规则:如果对对象调用 alloc、new 或 copy,则必须释放它。

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

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

【讨论】:

  • 我认为自动释放只是保留内存,直到下次执行处理自动释放池。它实际上并没有正确地进行引用计数——那将是垃圾收集。
  • @BenFlynn Autoreleasing 意味着对象的保留计数将在它所在的自动释放池的下一个排水管中减 1。如果在此之前它没有被其他任何东西保留,它将被释放.如上所述,它与将对象设置为 nil 无关。根据答案中的粗体字母规则,自动发布与发布相同(只是延迟发布)。
  • @BenFlynn 正确,正如 borrrden 所阐述的,我被误认为 autoreleasepool 耗尽的性质。为了不传播错误信息,编辑了我的答案!
猜你喜欢
  • 2011-03-21
  • 2017-04-01
  • 1970-01-01
  • 2016-07-06
  • 2011-04-27
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多