【问题标题】:Are NSOperationQueues retained automatically while running?NSOperationQueues 在运行时会自动保留吗?
【发布时间】:2014-06-25 17:43:58
【问题描述】:

这可能是一个简单的问题,但我进行了几次快速搜索,但找不到答案。我是否必须保留NSOperationQueue(通过使用属性等)以避免在方法完成执行后释放它。例如:

- (void)doOperation:(NSOperation *)someOperation {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]
    [queue addOperation:someOperation];
}

我知道队列在执行时会保留该操作,但是队列是否会被 arc 释放,因为它在此方法范围之外没有显式引用?

【问题讨论】:

  • 这很相似,但这说明这只是无证行为,我很好奇实际会发生什么。我想我会在队列运行时保留队列以确保安全。
  • 我的实验也表明队列是保留的。但只要它没有被记录在案,就可能不应该依赖它。
  • 如何将 NSOperationQueue 声明为弱属性并覆盖 getter 以进行惰性实例化?这样您就不必不断地分配/初始化一个新队列,您可以在整个类中使用相同的属性,并且队列的内存管理也将非常有效。
  • @MartinR 自该评论以来可能已经发生了这种情况,但文档(现在)实际上说“操作队列保留操作直到它们完成,并且队列本身被保留直到所有操作完成。” [强调我的。]

标签: ios objective-c automatic-ref-counting nsoperationqueue


【解决方案1】:

文档说:

操作队列在完成之前保留操作,并且在所有操作完成之前保留队列本身。

因此,常见的模式

[[[NSOperationQueue alloc] init] addOperation:op];

或者,在 Swift 中

OperationQueue().addOperation(op)

是安全的。

【讨论】:

  • 即使它有效,这样做不是一个坏主意吗?您将无法取消操作(例如,如果应用程序进入后台)并且如果任何操作阻塞并且无法从队列中删除,则它有点内存泄漏.此外,操作本身可能有一个对视图控制器的引用,该视图控制器随后不会被释放。
  • 当然可以,但这与使用 GCD 异步跳转到后台 DispatchQueue 的常见模式有何不同?
  • 我对 GCD 的了解不够深入,无法进行比较,但是当我看到这种技术时,我的第一感觉是它很容易出现错误
  • 当然,我不建议这样做。但这不是问题所在。
猜你喜欢
  • 2011-09-23
  • 2011-12-19
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2013-02-17
  • 2016-05-11
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多