autoreleasepool 自动释放池的理解

常见的面试题:以下代码存在什么样的问题?应该如何改进?

 

    for (int i = 0; i < 100000; i++) {

            NSString *str = @"abc";

            str = [str stringByAppendingString:@"xyz"];

    }

 

利用leaks查看内存泄漏情况

 

 

可知:NSString对象str并没有马上被释放,在内存中会同时存在100000个NSString对象,造成内存急增,等100000for循环结束才释放

改进:

    for (int i = 0; i < 100000; i++) {

        @autoreleasepool {

            NSString *str = @"abc";

            str = [str stringByAppendingString:@"xyz"];

        }

    }

 

或者(注意NSAutoreleasePool ARC下不可用,必须将工程改为MRC)

 

    for (int i = 0; i < 100000; i++) {

        //创建一个自动释放池

        NSAutoreleasePool *pool = [NSAutoreleasePool new];

        NSString *str = @"abc";

        str = [str stringByAppendingString:@"xyz"];

        //自动释放池被销毁或耗尽,会向自动释放池中的所有对象发送release消息

        [pool drain];

    }

 

利用leaks查看内存泄漏情况

 

 

可知:不会造成内存急增,每次for循环结束NSString对象str都会释放,在内存中会只存在1个NSString对象str

 

自动释放池(autoreleasepool)的工作原理:

    //@autoreleasepool {}中的代码

    void *context = objc_autoreleasePoolPush();

    //当前runloop迭代结束时进行pop操作

    objc_autoreleasePoolPop(context);

 

autoreleasepool是个栈结构,对象加入池子时其实质是进行入栈Push操作,释放对象时其实质是进行出栈Pop操作。

 

标记为autorelease的对象在出了作用域范围后,会被添加到最近一次创建的自动释放池中,当前runloop迭代结束时,会向自动释放池中的所有对象发送release消息,当池子里的所有对象引用计数都为0

时该池子被销毁

 

转载于:https://www.cnblogs.com/huangzs/p/9324369.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值