2011-04-10 81 views
2

我有一個奇怪的問題,顯示(空),當另一個ViewController來來去去。我將它追溯到它讀取要顯示給tableview的數據的地方,並發現它讀取的數據爲空。爲了調試這個,我需要了解內存管理如何真正適用於iPhone。我在我的應用程序委託中使用了下面的代碼來創建一個對象數組。這是來自我爲我的應用修改的示例代碼。我的問題是,當一個像這樣創建一個數組時,[tempArray release]是否會釋放剛創建的數組?分配和釋放內存在iPhone Xcode 3.2.5,iOS 4.2.1

//Initialize the hardware array. 
NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
self.hardwareArray = tempArray; 
[tempArray release]; 

這種類型的代碼似乎是非常常見的iPhone。例如,教程一直在說,現在您已將數據傳遞給控制器​​,您可以釋放它。但是我的C和C++經驗告訴我,如果你釋放內存,它就會消失,如果它的地址坐在堆棧的某個位置,它就沒有用。數據是否被複制到另一個地方而不是地址被傳遞?

此外,當釋放一個像下面這樣的設置例程中的內存時,我應該在釋放它之前檢查modleName是否不爲零。如果發佈的modelName已經是零,會發生什麼情況?

-(void) setModelName:(NSString *)newValue { 
    self.isDirty = YES; 
    [modelName release]; 
    modelName = [newValue copy]; 
} 

回答

2

我的問題是,當一個創建一個這樣的數組,將在[tempArray發行]實際上釋放剛創建的陣列?

如果對象的@propertyassign它將被釋放。但通常您使用retaincopy作爲@property。如果物業保留,您撥打self.hardwareArray = ...(即[self setHardwareArray:...])的二傳手將保留該物品。如果該屬性是複製,它將創建一個已保留的新對象。

此外,當釋放內存設置例程如下所示,我應該檢查,看看如果modleName是不是零,然後釋放它。發生了什麼事是一個釋放modelName已經是零?

在發送到零的objective-c消息是完全合法的。無需擔心,無需檢查零。
如果您在dealloc之外釋放實例變量,則應在釋放它之後將其設置爲零。