2013-07-16 27 views
0

我有一個NSMutableArray,它包含了我創建並分配了內存的一大堆UITextFields。設置NSMutableArray中的元素爲零

在我的viewDidUnload方法中,我需要釋放這個內存。我該怎麼做?

for(int i = 0; i < [arr count]; i++){ 
    UITextField* txtField = [arr objectAtIndex i]; 
    txtField = nil; 
} 
arr = nil; 

這項工作?或者我只需要設置arr = nil;?

我使用ARC,所以我設置爲零,無法釋放。

回答

0

讓我們看看你的代碼不明白髮生了什麼什麼:

UITextField* txtField = [arr objectAtIndex i]; 

,使一個複製數組中的價值,並在NSMutableArray值是引用,並存儲在一個變量值txtField。由於txtField被隱含地定義爲保留強引用,ARC將(根據任何優化)在引用(也稱爲「保留」)中註冊所有權權益。您的下一行:

txtField = nil; 

存儲零參考值txtField。由於txtField擁有強有力的參考,任何商店都會導致ARC放棄存儲在變量中的以前參考值中的所有權利益(又名「發行版」)。

該數組從未改變。您已經遍歷其內容,複製每個值,保留該值,並釋放該值。最後你寫:

arr = nil; 

它存儲零參考值在arr。由於arr擁有強大的參考價值,因此任何商店都會導致ARC放棄存儲在變量中的以前參考值中的所有權利益(又稱「發佈」),並且以前的值是您對NSMutableArray的參考。如果數組中沒有其他所有者,則它將被銷燬,並且當數組被銷燬時,它將放棄它所包含的任何值的所有權 - 在這種情況下,這是您的UITextField實例,並且如果沒有其他所有者,那麼它們是摧毀...

所以頂多你需要的是:

arr = nil 

但你可能甚至不需要說。由於arr在其生命週期結束時保留強引用 - 在包含其聲明的塊或方法結束時(如果是局部變量),或者實例在實例變量被銷燬時 - 那麼ARC將放棄其所有權利益等等。

HTH

+0

好的。這就說得通了。 感謝您的幫助。 – user1087185

0

使用ARC時,通過將變量設置爲零來釋放變量,就像您使用arr = nil所做的那樣。請注意,只有當指向對象的所有指針都設置爲零時,內存纔會被釋放,所以請確保您沒有在其他地方保留它們。

其次,如果你正在運行到內存問題,你應該在didReceiveMemoryWarning方法來處理這一點,因爲viewDidUnload不再支持iOS 6.

+0

好的。所以從ios 6我使用didReceiveMemoryWarning釋放任何東西,而不是viewDidUnload? – user1087185

+0

如上面jb_OH所述,視圖控制器從導航堆棧彈出時,視圖控制器的所有屬性都將被釋放。如果出現內存不足錯誤,則只需手動發佈。如果內存不足,則應該在didReceiveMemoryWarning中處理釋放對象。您可以在iOS 5和iOS 6上執行此操作,並且爲了保持一致性,我會推薦您。 –

1

如果陣列是視圖控制器的一個實例變量,如只要您使用ARC,它將在視圖控制器離開內存時自動解除分配。

如果您需要手動刪除陣列,請將其設置爲零。

arr = nil; 

如果您以後需要重新使用該陣列,則需要在將其設置爲nil後重新分配該陣列。

假設你的數組是你的對象的@property,一個好的技巧是在陣列中,吸氣分配:

-(NSMutableArray*)arr { 
    if (!_arr) { 
     _arr = [[NSMutableArray alloc] init]; 
    } 
    return _arr; 
} 

這樣,當您嘗試訪問它,你總是得到一個數組,即使它以前被設置爲零。

+0

arr是viewController的一個屬性。 所以我不需要=無我分配的任何弧線?一旦控制器離開內存,它們會自動釋放,所以當我更改視圖控制器時? – user1087185

+0

正確,這是ARC的一大優點之一。在過去,你必須釋放和釋放對象。現在它已經爲你完成了。 –

+0

這很棒。 感謝您的幫助。 – user1087185