繁体   English   中英

当自动释放池在后台线程中释放 object 时?

[英]When autorelease pool release object in background thread?

我知道自动释放池会在 state kCFRunLoopBeforeWaiting中的运行循环时释放对象。

所以我创建了一个runloop默认不运行的后台线程。

如果我在这个后台线程中使用自动释放池,它什么时候释放对象。

https://developer.apple.com/documentation/foundation/nsautoreleasepool?language=objc

自动释放池只是用于保持自动释放 object 的无限堆栈。 当您创建自动释放池时,池堆栈会推送一个观察者。 当您在 object 上调用 autorelease 时,object 被推入池堆栈。 当您释放自动释放池时,它会在观察者之后释放所有推送的 object,然后删除观察者。

objc 中的 @autorelease 或 swift 中的 autorelease 只是一个用于创建自动释放池、调用块然后释放池的包装器。

runloop 会自动将任务包装到自动释放池中。

但是当您将自动释放池与没有运行循环的自定义线程一起使用时,在我看来,object 将在线程退出时释放..

如何观察自动释放时间

您可以创建一个自定义手表 class 并定义 deinit,并手动保留和自动释放它,以观察 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 的回溯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM