zoukankan      html  css  js  c++  java
  • autoreleasepool自动释放池

     示例:
    @autoreleasepool {
            for (int i=0; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替)
                Person *per = [[Person alloc] init];
                [per autorelease];
            }
        }

    内存管理的原则:如果对一个对象使用了alloc、copy、retain,那么你必须使用相应的release或者autorelease。咋一看,这道题目有alloc,也有autorelease,两者对应起来,应该没问题。但autorelease虽然会使引用计数减一,但是它并不是立即减一,它的本质功能只是把对象放到离他最近的自动释放池里。当自动释放池销毁了,才会向自动释放池中的每一个对象发送release消息。这道题的问题就在autorelease。因为largeNumber是一个很大的数,autorelease又不能使引用计数立即减一,所以在循环结束前会造成内存溢出的问题。

    修改如下:

    @autoreleasepool {
            for (int i=0; i[100000; i++) { (因识别问题,该行代码中尖括号改为方括号代替)
                @autoreleasepool {
                Person *per = [[Person alloc] init];
                [per autorelease];
            }
          }
        }

    在循环内部再加一个自动释放池,这样就能保证每创建一个对象就能及时释放。

  • 相关阅读:
    webpack 代码拆分,按需加载
    Linux 安装 node
    H5项目常见问题及注意事项
    低耦合,高内聚。实乃至理名言
    Generator 函数学习笔记
    async 函数学习笔记
    JavaScript 中的 Thunk 函数
    Promise 学习笔记
    vb.net WIN32API 获取listview的值
    vb WIN32 API获取syslistview行数
  • 原文地址:https://www.cnblogs.com/weiboyuan/p/5237293.html
Copyright © 2011-2022 走看看