刀哥多线程自动释放池autoreleasepool

自动释放池

  • 作用

    • 自动释放对象的
    • 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中
    • 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息,释放池中对象
    • 自动释放池,在 ARC & MRC 程序中,同样有效

高级面试题:

  • 自动释放池是什么时候创建的?什么时候销毁的?

  • 创建,运行循环检测到事件并启动后,就会创建自动释放池

  • 销毁:一次完整的运行循环结束之前,会被销毁

  • 常见面试题
for (long i = 0; i < largeNumber; ++i) {
    NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
    str = [str uppercaseString];
    str = [str stringByAppendingString:@" - world"];
}
  • 提问:以上代码是否有问题?如果有,如何解决?

  • 解决方法:引入自动释放池

    • 1> 外面加自动释放池(快):能够保证for循环结束后,内部产生的自动释放对象,都会被销毁
      需要等到 for 结束后,才会释放内存
    • 2> 里面加自动释放池(慢):能够每一次 for 都释放产生的自动释放对象!
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSLog(@"start");
    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
    [self answer1];
    NSLog(@"外 %f", CFAbsoluteTimeGetCurrent() - start);

    start = CFAbsoluteTimeGetCurrent();
    [self answer2];
    NSLog(@"内 %f", CFAbsoluteTimeGetCurrent() - start);
}

- (void)answer1 {
    @autoreleasepool {
        for (long i = 0; i < largeNumber; ++i) {
            NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
            str = [str uppercaseString];
            str = [str stringByAppendingString:@" - world"];
        }
    }
}

- (void)answer2 {
    for (long i = 0; i < largeNumber; ++i) {
        @autoreleasepool {
            NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
            str = [str uppercaseString];
            str = [str stringByAppendingString:@" - world"];
        }
    }
}
  • 实际测试结果,是运行循环放在内部的速度更快!
  • 日常开发中,如果遇到局部代码内存峰值很高,可以引入运行循环及时释放延迟释放对象

转载于:https://www.cnblogs.com/jiahao89/p/5118275.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值