Advanced Autorelease Pool 高级自动释放池

在之前的章节你已经学习了很多基本的内存方面的知识。这个部分将会涉及到使用自动释放的高级技术,同时展示你应该在哪里使用,从而在受限的情况下获得比较高的性能。

在每一个线程中,你应该要有一个自动释放池来收集和存储所有自动释放的对象。如果在每一个线程中,没有自动释放池的话,所有的autoreleased对象会泄露,你将会有一个重大的内存泄露。自动释放池是通过栈的形式组织在一起的;下面部分会解释。

自动释放池和栈

自动释放池存储在一个栈中,通常被理解成嵌套的。无论何时你创建一个新的自动释放池,它都会被push到栈的顶部。然后所有新的autoreleased对象会被push到这个新的自动释放池中。

通过下面的代码你可以看到,对象(比如myArray和myString)内部的方法doSomething将会存储在myPool中,而不是应用的main pool中:

- (void)doSomething {

@autoreleasepool {

NSArray *myArray = [NSArray array];

NSString *myString = [NSString string];

}

}

这是main方法的main pool:

int main(int argc, char *argv[]){

@autoreleasepool {
           int retVal = UIApplicationMain(argc, argv, nil, nil);

}

return retVal;

}

在@autoreleasepool块结束的时候,当时间生命周期结束时,所有存储在这个pool中的autoreleased对象jiang将被released。

图7-9展示了这个概念。对于一个好的性能来说,这是一个非常重要的概念 --  知道尽可能快的release对象。

自动释放池和线程

当创建一个新的线程时,你需要创建一个新的自动释放池对象,然后将这个pool和新的线程联系在一起。因此当线程停止时,你的自动释放池会deallocated,所有的autoreleased对象也会deallocated。第6章我会深入的讨论这个主题,所以你应该复习一下,如果你在理解概念时需要一些帮助的话。

自动释放池对性能的影响

旧的内存管理规则依然能够应用在用ARC编写的代码上,如果你没有使用new,alloc和copy调用一个方法,这个对象就已经是autoreleased了。如果你在一个循环中创建了很多的autoreleased对象,很快内存就会耗尽。

这个代码演示了在循环中处理内存管理最好的方法:

- (void)doSomethingWithAutoRelease {

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

@autoreleasepool {
                Product *product = [Product productWithItemID:@""];

// process and display the product here

}

}

}

在循环结束的时候,以及在@autoreleasepool块的尾部,所有的autoreleased对象会released。这种方法你能够控制和release所有位使用的对象和回收你的内存。

Instruments

当我讨论使用设备和模拟器测试的时候,第2章已经介绍过Instruments。在这个部分,我将简短的讨论一些更加更高级的问题,这些问题会影响到你应该选择什么样的内存管理方式。

大部分时间,你需要使用到4中主要的instruments。

  • Static Analyzer

  • Leaks Instruments

  • Zombie

  • Object allocation

Static Analyzer

static Analyzer是一个比较快速的方法检查一些微小的比较明显的内存泄露。例如,如果你alloc了一个新的对象,没有在方法内release它,如图7-10所示,Static Analyzer能够快速的发现。

Leak Instrument

Leaks Instrument更加复杂,它需要时间允许和分析,但是会给出更好的结果。在运行过程中,它能够检测到所有数据轨迹的内存泄露。

Leaks Instrument能给出内存泄露对象更多的细节信息,如图7-11.

同样能够显示泄露确切的发生在哪一行(图 7-12)。

Zombie

Zombie能够帮助你检查EXEC_BAD_ACCESS导致的应用程序崩溃的问题。这是非常有帮助的,如果你的应用老是崩溃,但是通过日志或检查代码又发现不了问题的话。

如图7-13,Zombie会显示给你一个actions的list,包括malloc,autorelease,retain,和release,当应用崩溃的时候。你使用Zombie跟踪autorelease和release方法。

Object Allocation

Object allocation是我要介绍的内存相关的最后一个工具。它显示了运行过程中,所有内存的使用情况。这个工具是非常有用的,当内存使用增长很多,你需要跟踪使用内存较多的那些代码。

图7-14显示了代码所在行,对象创建的时间,和创建对象的调用者。

Memory Waring Levels

最后我要讨论的是关于内存警告。当你的内存增长到一定点时,iOS系统会尝试告诉你,通过在view controller中调用didReceiveWarning方法。你应该在这个方法中释放一些内存。

注意:在你的应用中还有其他方法收到内存警告:applocation delegate收到内存警告,然后在其他对象中调用相应的方法,或者你的对象通过NSNotification注册了接受内存警告的通知。

内存警告的第1级别是最重要的:它意味着你的代码已经快速的使用了很多内存。否则,你的app将会收到第2个级别的警告,然后会崩溃。

总结

内存对你的app的性能有重要影响。如果你不恰当的使用会导致你的app崩溃。在本章,你学到了在objective-c中很多关于内存管理方面的重要概念,这能够帮助你避免内存泄露和应用程序崩溃。UIViewController的生命周期同样非常重要,因为它和内存的管理和控制有关。它同样会影响到应用的性能和体验。最后,你学到了当在处理内存时,autorelease和release的不同,以及何时应该用其中的一个替代另外一个。

转载于:https://blog.51cto.com/ikinglai/1255675

iOS优化内存,提升性能 之五相关推荐

  1. 华为C8813Q刷机包 基于乐蛙OS5 优化内核 提升性能 稳定流畅

    ROM介绍 基于乐蛙官方os5编译而成 增强内核,提升运行速度 深度精简内置App,减少内存占用 添加Google服务 改善wifi达到省电效果 优化触屏,响应更快 采用三星滴水音效 基本保留乐蛙官方 ...

  2. 什么是php-fpm?如何进行优化来提升性能?

    什么是php-fpm?下面本篇带大家了解一下php-fpm,介绍一下优化 php-fpm 时我们到底要优化什么,希望对大家有所帮助! PHP是无处不在的,可以说是互联网 Web 应用上使用最广泛的语言 ...

  3. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  4. iOS 使用Instruments优化内存性能

    iOS 使用Instruments优化内存性能 问题 项目中使用到图片合成视频,发现内存增长十分的迅速,导致一些因为内存引起的问题,本文使用这个案例,结合Instruments工具检测和分析问题,最终 ...

  5. iOS性能优化-内存优化(1)

    1.iOS的内存管理机制 Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中. 而在iPhone和iPad等苹果移动终端设备中是不支持垃圾回收机制的.在移动 ...

  6. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  7. iOS进阶之页面性能优化

    作者: hi_xgb 地址: http://www.jianshu.com/p/1b5cbf155b31 前言 在软件开发领域里经常能听到这样一句话,"过早的优化是万恶之源",不要 ...

  8. Unity 3D中的内存管理与优化游戏运行性能的经验

    Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽 ...

  9. ios应用相关的性能优化及参考文档

    ios app programming guide: https://developer.apple.com/library/ios/documentation/iphone/conceptual/i ...

最新文章

  1. SpringBoot (八) :Spring Boot多数据源(JdbcTemplate)配置与使用
  2. iOS企业版使用第三方实现自动更新版本
  3. 2.vue 安装教程
  4. 【C++深度剖析教程9】初探C++标准库
  5. 连接查询_左连接/右连接/全连接的区别
  6. rabbitmq可靠性投递_RabbitMQ 可靠投递
  7. 如何有效地遍历Java Map中的每个条目?
  8. 多传感器融合定位技术
  9. 阿里技术专家:一文教你高效画出技术架构图
  10. 福利福利!!!!!!!!往这看!!!!!
  11. Devcpp、Codeblocks如何设置支持c++11
  12. 【Excel使用技巧】Excel数据导入sql
  13. PS一次性导出多倍图@1x、@2x、@3x
  14. Extracting and Composing Robust Features with Denoising Autoencoders论文笔记
  15. Bit Vector算法
  16. 《离散数学及应用》第七版奇数题课后习题
  17. learnpythonthehardway.org_Python学习笔记LearnPythonHardWay
  18. 任务管理器不能使用解决方法
  19. jQuery 输入框的onblur事件
  20. 重启postgre_pgsql如何重启

热门文章

  1. 思科网络设备模拟器GNS3与SecureCRT关联
  2. wss3.0 对文档库的一些操作
  3. Oracle 有long类型字段的表 使用insert into select 语句 ,出现:ORA-00997 错误
  4. onCreate onRestoreInstanceState onSaveInstanceState
  5. 我的2012移动开发年度总结——革命的一年
  6. CentOS4.4平台下安装EXTMAIL手记V1.3
  7. T-SQL 查询、修改数据表
  8. 写给我--过去,现在,未来
  9. css布局模型(摘抄自慕课)
  10. Windows Mobile获取通话记录 C#