自动释放池何时在后台线程中释放对象?
When autorelease pool release object in background thread?
我知道自动释放池会在运行循环处于kCFRunLoopBeforeWaiting
.
状态时释放对象
所以我创建了一个后台线程,默认情况下 运行loop 不会 运行。
如果我在这个后台线程中使用自动释放池,它什么时候释放对象。
https://developer.apple.com/documentation/foundation/nsautoreleasepool?language=objc
autorelease pool 只是一个用于保存autorelease 对象的无限堆栈。
当您创建自动释放池时,池堆栈会推送一个观察者。
当您在对象上调用自动释放时,该对象将被推入池堆栈。
当您释放自动释放池时,它会释放所有在 watcher 之后推送的对象,然后删除 watcher。
objc 中的@autorelease 或 swift 中的 autorelease 只是创建自动释放池、调用块然后释放池的包装器。
runloop 会自动将任务包装到自动释放池中。
但是当您将自动释放池与没有运行循环的自定义线程一起使用时,根据我的观察,对象将在线程退出时释放..
如何观察自动释放时间
您可以创建一个定义了 deinit 的自定义监视 class,并手动保留和自动释放它,以观察 deinit 时间。代码如下
class A {
deinit {
print("a dealloced")
}
}
var p: pthread_t?
_ = pthread_create(&p, nil, { (p) -> UnsafeMutableRawPointer? in
do {
let a = A()
_ = Unmanaged.passRetained(a).autorelease()
}
print("will exit pthread")
return nil
}, nil)
pthread_join(p!, nil)
print("finish")
此脚本将打印
will exit pthread
a dealloced
finish
你也可以在 deinit 处断点查看 autorelease 的回溯
我知道自动释放池会在运行循环处于kCFRunLoopBeforeWaiting
.
所以我创建了一个后台线程,默认情况下 运行loop 不会 运行。
如果我在这个后台线程中使用自动释放池,它什么时候释放对象。
https://developer.apple.com/documentation/foundation/nsautoreleasepool?language=objc
autorelease pool 只是一个用于保存autorelease 对象的无限堆栈。 当您创建自动释放池时,池堆栈会推送一个观察者。 当您在对象上调用自动释放时,该对象将被推入池堆栈。 当您释放自动释放池时,它会释放所有在 watcher 之后推送的对象,然后删除 watcher。
objc 中的@autorelease 或 swift 中的 autorelease 只是创建自动释放池、调用块然后释放池的包装器。
runloop 会自动将任务包装到自动释放池中。
但是当您将自动释放池与没有运行循环的自定义线程一起使用时,根据我的观察,对象将在线程退出时释放..
如何观察自动释放时间
您可以创建一个定义了 deinit 的自定义监视 class,并手动保留和自动释放它,以观察 deinit 时间。代码如下
class A {
deinit {
print("a dealloced")
}
}
var p: pthread_t?
_ = pthread_create(&p, nil, { (p) -> UnsafeMutableRawPointer? in
do {
let a = A()
_ = Unmanaged.passRetained(a).autorelease()
}
print("will exit pthread")
return nil
}, nil)
pthread_join(p!, nil)
print("finish")
此脚本将打印
will exit pthread
a dealloced
finish
你也可以在 deinit 处断点查看 autorelease 的回溯