iOS优化内存,提升性能 之五
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优化内存,提升性能 之五相关推荐
- 华为C8813Q刷机包 基于乐蛙OS5 优化内核 提升性能 稳定流畅
ROM介绍 基于乐蛙官方os5编译而成 增强内核,提升运行速度 深度精简内置App,减少内存占用 添加Google服务 改善wifi达到省电效果 优化触屏,响应更快 采用三星滴水音效 基本保留乐蛙官方 ...
- 什么是php-fpm?如何进行优化来提升性能?
什么是php-fpm?下面本篇带大家了解一下php-fpm,介绍一下优化 php-fpm 时我们到底要优化什么,希望对大家有所帮助! PHP是无处不在的,可以说是互联网 Web 应用上使用最广泛的语言 ...
- 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...
- iOS 使用Instruments优化内存性能
iOS 使用Instruments优化内存性能 问题 项目中使用到图片合成视频,发现内存增长十分的迅速,导致一些因为内存引起的问题,本文使用这个案例,结合Instruments工具检测和分析问题,最终 ...
- iOS性能优化-内存优化(1)
1.iOS的内存管理机制 Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中. 而在iPhone和iPad等苹果移动终端设备中是不支持垃圾回收机制的.在移动 ...
- iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍 得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...
- iOS进阶之页面性能优化
作者: hi_xgb 地址: http://www.jianshu.com/p/1b5cbf155b31 前言 在软件开发领域里经常能听到这样一句话,"过早的优化是万恶之源",不要 ...
- Unity 3D中的内存管理与优化游戏运行性能的经验
Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽 ...
- ios应用相关的性能优化及参考文档
ios app programming guide: https://developer.apple.com/library/ios/documentation/iphone/conceptual/i ...
最新文章
- SpringBoot (八) :Spring Boot多数据源(JdbcTemplate)配置与使用
- iOS企业版使用第三方实现自动更新版本
- 2.vue 安装教程
- 【C++深度剖析教程9】初探C++标准库
- 连接查询_左连接/右连接/全连接的区别
- rabbitmq可靠性投递_RabbitMQ 可靠投递
- 如何有效地遍历Java Map中的每个条目?
- 多传感器融合定位技术
- 阿里技术专家:一文教你高效画出技术架构图
- 福利福利!!!!!!!!往这看!!!!!
- Devcpp、Codeblocks如何设置支持c++11
- 【Excel使用技巧】Excel数据导入sql
- PS一次性导出多倍图@1x、@2x、@3x
- Extracting and Composing Robust Features with Denoising Autoencoders论文笔记
- Bit Vector算法
- 《离散数学及应用》第七版奇数题课后习题
- learnpythonthehardway.org_Python学习笔记LearnPythonHardWay
- 任务管理器不能使用解决方法
- jQuery 输入框的onblur事件
- 重启postgre_pgsql如何重启
热门文章
- 思科网络设备模拟器GNS3与SecureCRT关联
- wss3.0 对文档库的一些操作
- Oracle 有long类型字段的表 使用insert into select 语句 ,出现:ORA-00997 错误
- onCreate onRestoreInstanceState onSaveInstanceState
- 我的2012移动开发年度总结——革命的一年
- CentOS4.4平台下安装EXTMAIL手记V1.3
- T-SQL 查询、修改数据表
- 写给我--过去,现在,未来
- css布局模型(摘抄自慕课)
- Windows Mobile获取通话记录 C#