这里仅讨论属性为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,看着很别扭,容易误导。其次,如果前两句放在一个循环体里面,那么就又内存泄露了,只有分配,没有释放。
第三种情况,中间对象没有释放。
第四种情况,效果等同于第二种情况,缺点也相同。
综上所述,只有第一种情况是可以采用的。
由于本人也是新手,被内存问题折磨的纠结了很长一段时间,现在终于有了一个初步的理解,故与大家共同分享经验,希望有所帮助。当然更高阶的东西还没有接触到,故称之为第一重境界。
第一只种情况,是推荐的使用方法,标准的使用方法,可以称之为三段论。
好处:没有内存泄露,alloc后紧接着release出现,容易理解。
当然首先要搞明白self做了什么。判断新旧对象是否相等,如果不等,先release旧的(-1),再retain新的(+1)。
第二种情况,首先最后一句必须去掉,否则对象都释放了。去掉最后一句,好像不会出错了,但是:第一,alloc后没有release,看着很别扭,容易误导。其次,如果前两句放在一个循环体里面,那么就又内存泄露了,只有分配,没有释放。
第三种情况,中间对象没有释放。
第四种情况,效果等同于第二种情况,缺点也相同。
综上所述,只有第一种情况是可以采用的。
由于本人也是新手,被内存问题折磨的纠结了很长一段时间,现在终于有了一个初步的理解,故与大家共同分享经验,希望有所帮助。当然更高阶的东西还没有接触到,故称之为第一重境界。