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
原创粉丝点击