小编fra*_*ank的帖子

autorelease和runloop和线程的关系?

我有一个关于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将存在所有应用程序的生命?)所以我不确定..

任何要点和相关文件将不胜感激!

autorelease nsthread nsautoreleasepool runloop ios

2
推荐指数
1
解决办法
782
查看次数

DispatchQueue.global()默认qos是userInitiated?

我写一个演示

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)

queue grand-central-dispatch ios swift

1
推荐指数
1
解决办法
1596
查看次数