对象内存管理的学习

学习IOS内存管理也有一段时间,但是总感觉似是而非,对于基本的管理原则很清楚:即谁创建谁来释放。但是对于一些比较隐式的东西则感觉很模糊,如最简单的对象字段的赋值,如my.name=value; 当value释放时,则my.name将指向一个不是以前内容的地址,这个地址的内容可能是任意的内容,随之也就引起了指针的危险性,即野指针,当后面继续使用这个指针时则将会出现问题,这也就是经常会发生的问题。为了解决这个问题,最好的方法是利用Setter来控制内存的管理,在setter中的模板如下-(void) setName:(NSString * name){

if(self.name !=name){

[self.name release];

self.name=[name retain];

}

}

通过这个模块则可以解决对象的内存管理。当然本文是针对于NARC来说的,对于ARC则不需要担心这样的问题,编译器会帮助我们来处理这样的问题。

另外对于一些Cocoa类的属性,由于其向后兼容性,其定义的类型为non-ARC weak类型,如NSnotificationCenter,当你添加一个通知对象时,其默认类型为non-ARC weak,当这个对象(如self)被销毁时,NSnotificationCenter依然指向原来的地址,这样当其发送通知时,则会出现野指针调用,这会造成潜在的危险,为了避免这种情况的发生,需要在合适的地方进行unregister调用以使这个引用从NsnotificationCenter中先移除,另外一种情况是retain cycle,对于添加notification时,可能使用block,而在block中对自身对象引用时如(self.name=@"kkk")则会出现retain cycle.为了解决这种情况可以使用weak-Strong模式来解决,如在block外声明一weak 类型,而在block内部,则将这个weak类型assin给一相同的类型的strong 对象,这样就解决了retain cyle的情况。与这个类似的另外一种情况则是在界面中的UI对象与VC中相对应的属性,如果VC中属性为Strong类型,则也会出现retain cycle,因此VC中与UI相对应的属性其都为WEAK属性。另外NSTimer也会出现上面相同的情况,因此需要在合适的位置调用Invalitate来销毁重复使用的timer来防止内存问题的出现,最后容易出现野指针调用的是delegate,因delegate其内部是被定义为non-ARC weak 类型,因此很可能delegate 对象已经消失了,但是又向委托对象发送消息,这时就会出现问题,而且这个问题很可能会在对象消失很长时间的时候发生。



以上内容都是对于内存管理学习的一些认识,而这些知识都可在ios 7 Programming  Foudamentals 中内存管理章节找到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值