下ARC

2012-07-25 101 views
1

對象變量多次轉讓有內存管理的一個點,我就不太清楚100%,假設有下面的代碼:下ARC

{ 
NSString *string = [[NSString alloc] init]; 
string = [[NSString alloc] init]; 
} 

這是否導致了第一次分配的內存泄漏?如果不是爲什麼不呢?

回答

1

概念,BJ是正確的,但生成的代碼稍有不同。它是這樣的:

NSString *string = [[NSString alloc] init]; 

// Oh, we're changing what `string` points to. Gotta release the old value. 
NSString *tmpString = string; 
string = [[NSString alloc] init]; 
[tmpString release]; 
[string release]; // string goes out of scope at this point in your code 

這種操作順序通常不是關鍵的(如果你關心很瞭解,你可能不正確的編碼)。但是理解它解釋了爲什麼這些物體會在它們到達時被完全破壞。

1

不,它不會導致泄漏。 ARC將在設置第二個字符串之前釋放第一個字符串。這是ARC的真正驚人的力量!

+0

ARC會立即釋放它還是放入主autoreleasepool? – user523234 2012-07-25 14:57:46

2

在ARC下,這不會泄漏內存。這是因爲每當強對象指針改變時,編譯器自動發送release到舊對象。局部變量,例如NSString *string,默認情況下很強。

所以上面的代碼被編譯到更多的東西是這樣的:

{ 
NSString *string = [[NSString alloc] init]; 

// Oh, we're changing what `string` points to. Gotta release the old value. 
[string release]; 
string = [[NSString alloc] init]; 
} 
+0

ARC是否立即釋放它或只是放入主autoreleasepool? – user523234 2012-07-25 14:57:23

+1

立即釋放它,只要它確定舊值不再使用。 – 2012-07-25 15:10:04