對象變量多次轉讓有內存管理的一個點,我就不太清楚100%,假設有下面的代碼:下ARC
{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}
這是否導致了第一次分配的內存泄漏?如果不是爲什麼不呢?
對象變量多次轉讓有內存管理的一個點,我就不太清楚100%,假設有下面的代碼:下ARC
{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}
這是否導致了第一次分配的內存泄漏?如果不是爲什麼不呢?
概念,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
這種操作順序通常不是關鍵的(如果你關心太很瞭解,你可能不正確的編碼)。但是理解它解釋了爲什麼這些物體會在它們到達時被完全破壞。
不,它不會導致泄漏。 ARC將在設置第二個字符串之前釋放第一個字符串。這是ARC的真正驚人的力量!
在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];
}
ARC是否立即釋放它或只是放入主autoreleasepool? – user523234 2012-07-25 14:57:23
立即釋放它,只要它確定舊值不再使用。 – 2012-07-25 15:10:04
ARC會立即釋放它還是放入主autoreleasepool? – user523234 2012-07-25 14:57:46