• 刀哥多线程自动释放池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"];
            }
        }
    }
    • 实际测试结果,是运行循环放在内部的速度更快!
    • 日常开发中,如果遇到局部代码内存峰值很高,可以引入运行循环及时释放延迟释放对象
  • 相关阅读:
    uni-app开发的应用(小程序,app,web等),使用Node+Koa2开发的后端程序接收上传文件的方法
    ES6学习笔记之数组的扩展
    ES6学习笔记之字符串的扩展
    UnhandledPromiseRejectionWarning: SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    java之内存分布图
    java的构造方法
    java的局部变量和成员变量以及区别
    java类型转换详解(自动转换和强制转换)
    webpack入门宝典
    js函数之四大调用模式
  • 原文地址:https://www.cnblogs.com/jiahao89/p/5118275.html
Copyright © 2020-2023  润新知