在他的书中,考虑第 7 章中的这段代码,在非 ARC 环境中:
Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum=[[Fraction alloc] init],*sum2;
int i, n=5, pow2=2;
[sum setTo: 0 over: 1];
for (i = 1; i <= n; ++i){
[aFraction setTo: 1 over: pow2];
sum2 = [sum add:aFraction]; // Comment 1
[sum release];
sum = sum2; // Comment 2
pow2 *=2;
}
[sum doSomething];
[sum release];
有人可以确认我的理解是正确的:
注意,评论 1 - 我知道这个add
函数正在返回一个分配的对象,fyi,所以sum2
现在拥有一个对象(一个非自动释放的对象)(根据书中的其他代码)
问题,评论 2 - 我们发布了sum
- 所以sum
只是作为一个空指针持续存在,直到它被“分配”到sum2
?由于sum2
拥有一个对象,当在注释 1 处sum2
分配了一个新sum
的分配对象时,它仍然是先前迭代中对象的唯一所有者,并且 a[sum2 release]
不是必需的。当[sum release]
发生在评论 2 上方时,该对象最终消失,最终被同一循环中的新对象替换。这是正确的解释吗?
最后,虽然我们从来没有 release sum2
,因为sum=sum2
通过在最后做一个 `[sum release]',这使得程序没有内存泄漏,对吗?