【发布时间】:2017-03-01 21:07:27
【问题描述】:
我试图更好地理解保留周期,尤其是相对于调度队列。我正在使用 AVFoundation 并在 sessionQueue 上管理 AVCaptureSession:
private let sessionQueue = DispatchQueue(label: "com.andrewferrarone.sessionQueue")
在苹果文档的许多代码示例中,我看到了这一点:
self.sessionQueue.async { [unowned self]
//
}
这里的[unowned self] self 有必要吗? self (viewController) 引用 self.sessionQueue 并且分派到 self.sessionQueue 的闭包捕获 self。这是参考循环吗? self 没有引用闭包,只是 DispatchQueue。如果[unowned self] 是必要的,那么据我了解,如果我确定 self 不会为零,我只想使用unowned self。所以假设我在sessionQueue 上放置了一个需要很长时间的任务,并且 viewController 被弹出并在任务完成之前被释放? sessionQueue 和任务会发生什么?如果它仍然存在,当它尝试访问自身时,应用程序将崩溃。另一方面,由于 unowned self 不会增加 self 的保留计数,因此它不会阻止 viewController 被释放。
所以我的问题是,当 viewController 被解除分配时 DispatchQueues 会发生什么,在这种情况下,如果 viewController 在 dispatchQueue 任务完成之前被解除分配会发生什么?如果有人能阐明这里发生的一切,那将非常有帮助和感激。
感谢朋友们的帮助!
【问题讨论】:
标签: ios grand-central-dispatch retain-cycle