美文网首页
509,关于@autoreleasepool(面试点:1,如果你

509,关于@autoreleasepool(面试点:1,如果你

作者: 枫叶1234 | 来源:发表于2021-02-25 21:11 被阅读0次

    面试经常会有这样的问题:
    1.什么是@autoreleasepool?
    2.里面对象的内存什么时候释放?
    3.什么时候要用@autoreleasepool?

    回答:
    1.@autoreleasepool是自动释放池,让我们更自由的管理内存

    2.当我们手动创建了一个@autoreleasepool,里面创建了很多临时变量,当@autoreleasepool结束时,里面的内存就会回收

    3.ARC时代,系统自动管理自己的autoreleasepool,runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration。
    方便是方便了,但是有些情况下,我们还是需要手动创建自动释放池,那么,什么时候呢?

    • 如果你正在编写不基于UI 框架的程序,比如命令行工具。
    • 如果你编写的循环创建了很多临时对象。
      你可以在循环中使用自动释放池block,在下次迭代前处理这些对象。在循环中使用自动释放池block,有助于减少应用程序的内存占用。
    • 你生成了一个辅助线程。
      一旦线程开始执行你必须自己创建自动释放池。否则,应用将泄漏对象。

    这是苹果文档中的翻译,按我的理解,最重要的使用场景,应该是有大量中间临时变量产生时,避免内存使用峰值过高,及时释放内存的场景。
    举个例子

    NSArray *urls = <# An array of file URLs #>;
    for (NSURL *url in urls) {
        @autoreleasepool {
            NSError *error;
            NSString *fileContents = [NSString stringWithContentsOfURL:url
                                             encoding:NSUTF8StringEncoding
                                             error:&error];
        }
    }
    
    

    这个for循环里如果不使用@autoreleasepool,那临时变量内存可能是爆发式的,但是使用了@autoreleasepool,在每个@autoreleasepool结束时,里面的临时变量都会回收,内存使用更加合理。

    相关文章

      网友评论

          本文标题:509,关于@autoreleasepool(面试点:1,如果你

          本文链接:https://www.haomeiwen.com/subject/aotpfltx.html