IOS OC内存堆资源使用总结
来源:互联网 发布:淘宝如何删除好评 编辑:程序博客网 时间:2024/06/07 20:26
堆内存资源不是常量静态全局数据区,代码区,或栈区,不会运行中保持不变或自动清理,所以需要堆内存管理技术。
堆内存管理最主要的问题是:野指针空指针crash, 内存泄露(没有引用或者有引用导致不能重用)。
一. MRC:
1)ios 5.0之前谁拥有谁释放,不拥有不释放
alloc/init/new 引用计数会加1.
retain引用计数会加1.
使用完对象就要release.
@autoreleasepool是延迟清理,在调用对象调用autorelease后会塞入清理库中(并不增删引用计数),暂时在里面等待,当退出作用域则对pool中所有对象调用一遍release进行清理。
OC Foudation框架的对象都是添加了autorelease的,所以用MRC时,为了保持对象需要retain一下。
@autoreleasepool在MRC和ARC中表现都一样,只是手动autoreleasepool下MRC中需要手动添加autorelease语句。且非手动情况不会添加autoreleasepool。
2)类的变量或属性,调用一遍retain来保持其它模块的对象,生命周期很重要要强绑定。
再重写父类的dealloc方法时,要调用 [superdealloc];
3)循环引用的解除,只能另外一边release, 并用工具检查。
二.ARC:
1)ios5以后不要调用retain, release, autorelease,retainCount,xcode会自动添加, 自动释放时机要清楚避免性能问题。
再重写父类的dealloc方法时,不能再调用 [super dealloc];
自动添加的autoreleasepool和手动添加的autoreleasepool区别,隐式的pool是线程消息循环runloop才处理,显式是@autoreleasepool大括号结束或[pool drain]马上对所有对象调用release清理一遍。
enumerateObjectsUsingBlock在遍历里面会自动添加@autoreleasepool{},在大循环中可以提升性能,当然也可以在for/forin中手动添加@autoreleasepool{}马上清理产生的大量堆垃圾。
2)类的成员变量和属性要用强弱指针(子类,或代理类使用弱指针),保证赋值的指针所指向对象不被清理(默认指针都是强指针所以不用担心),也可以用强绑定来绑定声明周期。
属性默认不是strong类型,默认特性是 unsafe_unretained 相当于assign,被释放后会变成野指针,因此需要
@property(strong, nonatomic) NSMutableArray *birdNames;来保持,否则引用赋值给它,后面会导致crash。
3)循环引用问题,一方为弱指针或赋值为nil(赋值为nil时候解除了强引用会调用一次release, 隐式autoreleasepool中下次消息循环调用清理库),代码进行判空来解除该问题。
reference:
http://m.blog.csdn.net/article/details?id=51088479
http://blog.csdn.net/u012938194/article/details/50709466
http://www.cocoachina.com/ios/20141031/10107.html
http://www.cnblogs.com/wengzilin/p/4351187.html
0 0
- IOS OC内存堆资源使用总结
- 《iOS总结》OC内存管理-MickyChiang
- IOS开发---OC语言-㉖内存的总结
- IOS OC 内存管理
- OC内存管理总结
- OC内存管理总结
- IOS开发---OC语言-㉙内存管理:block的使用
- IOS--OC--总结
- 【iOS】OC总结
- IOS--OC--LessonMermory 内存管理
- IOS学习 -- OC内存管理
- IOS之OC内存管理
- OC内存管理总结一:
- OC内存管理总结二:
- OC内存管理总结三:
- OC内存管理要点总结
- 【总结】 - OC内存管理(1)
- 【总结】 - OC内存管理(2)
- 一个困扰已久的UIScrollView问题
- [SHOI2007]BZOJ1934 Vote善意的投票-最小割
- 1063
- ubuntu 16.04安装ROS环境
- POJ 1130 Alien Security 笔记
- IOS OC内存堆资源使用总结
- 解释Kullback-Leibler散度
- 定时任务Cron表达式详解和案例
- 关于PSNR和cSNR
- 输出<object returned empty description>
- ios
- java 对字符串的加密解密
- Netty高性能开发备忘录
- Lua迭代器和泛型for