IOS OC内存堆资源使用总结

堆内存资源不是常量静态全局数据区,代码区,或栈区,不会运行中保持不变或自动清理,所以需要堆内存管理技术。
堆内存管理最主要的问题是:野指针空指针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];

自动添加的autorelease pool和手动添加的autorelease pool区别,隐式的pool是线程消息循环runloop才处理,显式是@autorelease pool大括号结束或[pool drain]马上对所有对象调用release清理一遍。
enumerateObjectsUsingBlock在遍历里面会自动添加 @autorelease pool{},在大循环中可以提升性能,当然也可以在for/forin中手动添加 @autorelease pool{}马上清理产生的大量堆垃圾。

2)类的成员变量和属性要用强弱指针( 子类,或代理类使用弱指针),保证赋值的指针所指向对象不被清理(默认指针都是强指针所以不用担心),也可以用强绑定来绑定声明周期。
属性默认不是strong类型,默认特性是 unsafe_unretained 相当于assign,被释放后会变成野指针,因此需要
@property(strong, nonatomic) NSMutableArray *birdNames;来保持,否则引用赋值给它,后面会导致crash。

3)循环引用问题,一方为弱指针或赋值为nil(赋值为nil时候解除了强引用会调用一次release, 隐式autoreleasepool中下次消息循环调用清理库),代码进行判空来解除该问题。

reference:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值