自动释放池

  • 作用

    • 自动释放对象的
    • 所有 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"];
}
}
}
  • 实际测试结果,是运行循环放在内部的速度更快!
  • 日常开发中,如果遇到局部代码内存峰值很高,可以引入运行循环及时释放延迟释放对象

最新文章

  1. Linux用过的命令
  2. Shell练习
  3. css3圣诞雪景球开源
  4. gvim配置
  5. React Native在Windows下修改js代码后reload无效
  6. 数据库update的异常一例
  7. hdu 5120 Intersection 圆环面积交
  8. IP defragment
  9. Python核心编程读笔 11:模块
  10. dede织梦如何防止被黑客入侵渗透?
  11. Beta第七天
  12. Linux内核同步机制之(五):Read Write spin lock【转】
  13. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project triage: Compilation failure [ERROR] No compiler is provided in this environment.
  14. Flume概念与原理、与Kafka优势对比《转》
  15. 十分钟了结MySQL information_schema
  16. NC nc开发工具java虚拟机参数
  17. java Comparable 和 Cloneable接口
  18. 查看pip安装的Python库
  19. Spring AOP+Log4j记录项目日志
  20. yum实现仅仅下载不安装包

热门文章

  1. 【NOI2015】 软件包管理器 - 树链剖分
  2. 《Java从入门到失业》第二章:Java环境(三):Java命令行工具
  3. mac启动 Apache JMeter 5.3 语言选择中文界面出现乱码 问题解决
  4. springboot 读取resources下的文件然后下载
  5. onlyoffice在线编辑
  6. openvswitch 流表测试 ovs-appctl
  7. 计算机网络-应用层(3)Email应用
  8. Java多线程_同步工具CountDownLatch
  9. packmol建模流程-计算
  10. Ajax、XMLHttpRequest、JSONP的区别