我有一个关于autorelease的问题,现在我有以下代码:
int main(int argc, char *argv[]){
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}
Run Code Online (Sandbox Code Playgroud)
doc在@autoreleasepool {}结尾处说标记为autorelease的对象将收到一条释放消息.但是UIApplicationMain永远不会返回,这意味着流程永远不会到达@autoreleasepool的末尾,那么标记为autorelease的对象将永远不会释放,直到应用程序死掉.自动释放没有意义.....
我问过有人说iOS系统会生成一些线程,(你知道,一个线程,一个runloop).他说runloop会创建自动释放池.所以自动释放对象将在thead或runloop结束时释放.但在大多数情况下我们使用主线程.所以他所说的并不能说服我.
什么是使用自动释放的适当时间.它困惑了我很长一段时间.
我得到另一个观点,当一个runloop结束时,autorelease对象将被释放(主runloop将存在所有应用程序的生命?)所以我不确定..
任何要点和相关文件将不胜感激!
我写一个演示
let queue = DispatchQueue.global()
queue.async {
let group = DispatchGroup()
group.enter()
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now(), qos: .default) {
//do sth in default queue
group.leave()
}
group.wait()
DispatchQueue.main.async { [weak self] in
//do sth in main queue
}
}
Run Code Online (Sandbox Code Playgroud)
然后我收到线程性能检查警告
以 QOS_CLASS_USER_INITIATED 运行的线程正在等待以 QOS_CLASS_DEFAULT 运行的较低 QoS 线程。研究避免优先级倒置的方法
我尝试打印它显示的外部队列的 qos
(lldb) print queue.qos
(Dispatch.DispatchQoS) $R0 = {
qosClass = unspecified //I think this should be default.
relativePriority = 0
}
Run Code Online (Sandbox Code Playgroud)
苹果文档错了?
class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue
Run Code Online (Sandbox Code Playgroud)