【发布时间】:2020-09-23 03:49:39
【问题描述】:
我试图了解在 serial async DispatchQueue 中执行任务与通过 引用它在 方法/函数 中执行相同任务之间的区别>weak self 来自同一个 DispatchQueue。
代码 - 1
asyncAfter 块在 1.5 秒后执行,而 task() 正在处理这会关闭视图控制器,但 deinit() 仅在 task() 之后调用完成了。
class NewViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5, execute: {
self.dismiss(animated: false, completion: nil)
})
let queue = DispatchQueue(label: "myQueue", qos: .default)
queue.async {[weak self] in
self?.task()
}
}
private func task() {
print("start")
for i in 0...10000000 {
if i%500 == 0 {
}
}
print("stop")
}
deinit {
print("deinit")
}
}
控制台输出 = start stop deinit
代码 - 2
在这种情况下,deinit() 在视图控制器被关闭后按预期调用。
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5, execute: {
self.dismiss(animated: false, completion: nil)
})
let queue = DispatchQueue(label: "myQueue", qos: .default)
queue.async {[weak self] in
print("start")
for i in 0...10000000 {
if i%500 == 0 {
}
}
print("stop")
}
}
deinit {
print("deinit")
}
控制台输出 = 启动 deinit 停止
有人能解释一下为什么两者之间有区别吗?
【问题讨论】:
-
请尝试在
task()函数中分享print(Thread.current)的输出 -
@emrcftci 在
task()内的print(Thread.current)输出是<NSThread: 0x60000092d480>{number = 4, name = (null)}
标签: ios swift xcode multithreading memory