在他的書中,考慮從第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
函數返回一個alloc'd對象,僅供參考,所以sum2
現在擁有(在這本書按照其他代碼)的對象(非自動釋放對象)
問題,評論2 - 我們發佈sum
-也是如此只是作爲空指針持續存在,直到它被「分配」爲sum2
?由於sum2
擁有一個對象,因此sum2
在註釋1中分配了新的分配對象時,sum
仍然是先前迭代中對象的唯一所有者,並且[sum2 release]
不是必需的。當在評論2上方出現[sum release]
時,該對象最終消失,最終在同一循環中被新的替換。這是正確的解釋嗎?
最後,雖然我們從來沒有發佈sum2
,因爲sum=sum2
在最後做了一個`[sum release]',這就讓程序沒有內存泄漏,對嗎?