iphone开发之认识内存泄露第一重境界

这里仅讨论属性为retain的情况。

先贴一个网上已经传播泛滥的例子:

先看间接赋值
1.加self.:
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
self.myObject = aMyObject; //myObject retainCount = 2;
[aMyObject release];//myObject retainCount = 1;

2. 不加self.:
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
myObject = aMyObject; //myObject retainCount = 1;
[aMyObject release];//对象己经被释放

再看直接赋值的:
3.加self.:
self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;

4. 不加self.:
myObject = [[MyObject alloc] init]; //myObject retainCount = 1;

第一只种情况,是推荐的使用方法,标准的使用方法,可以称之为三段论。
好处:没有内存泄露,alloc后紧接着release出现,容易理解。
当然首先要搞明白self做了什么。判断新旧对象是否相等,如果不等,先release旧的(-1),再retain新的(+1)。

第二种情况,首先最后一句必须去掉,否则对象都释放了。去掉最后一句,好像不会出错了,但是:第一,alloc后没有release,看着很别扭,容易误导。其次,如果前两句放在一个循环体里面,那么就又内存泄露了,只有分配,没有释放。

第三种情况,中间对象没有释放。

第四种情况,效果等同于第二种情况,缺点也相同。

综上所述,只有第一种情况是可以采用的。

由于本人也是新手,被内存问题折磨的纠结了很长一段时间,现在终于有了一个初步的理解,故与大家共同分享经验,希望有所帮助。当然更高阶的东西还没有接触到,故称之为第一重境界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值