2012-05-07 25 views
0

我正在使用試圖獲得在他們自己的XIB中定義的幾個UITableCellView的高度。我創建了在UITableViewDelegate的回調heightForRowInPathIndex中使用的高度列表。當我這樣做時,應用程序崩潰,如果內存損壞。ios:爲什麼是臨時加載XIB,以獲取幀高度,破壞內存?

arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil]; 

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0]; 

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz]; 

[arrayOfTableCellView release]; 

我已經看過了retainCount,它和預期的一樣。

+1

就像一個說明:你不應該相信retainCount。你不知道幕後發生了什麼。你會得到什麼樣的錯誤?我揣測它是EXC_BAD_ACCESS? –

+0

順便說一句 - 錯誤是跳出應用程序。在我的Instrumentation期間,我的經驗是,其中大部分都是內存保留/釋放不一致。在某些情況下,殭屍。 – mobibob

回答

1

那麼答案是簡單,從文檔:

返回值

含有筆尖文件中的頂層對象的數組。數組 不包含對文件所有者或任何代理對象的引用; 它僅包含那些在將nib 文件解除存檔時實例化的對象。您應該手動保留返回的數組或 包含的對象,以防止 的nib文件對象被提前釋放。

看起來你只是將返回值賦值爲arrayOfTableCellView。如果你想保留返回值,並且arrayOfTableCellView實際上是你的viewController的一個屬性,那麼你應該使用self.arrayOfTableCellView來分配它。

如果您不保留它,您不必因爲不擁有它而將其釋放。所以,當你真正得到這樣

NSArray *arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil]; 

數組,然後你不希望有

[arrayOfTableCellView release]; 
在那裏

,因爲你沒有分配的對象。

編輯:

只是爲了calarify這個給你,我只是跑你的代碼,與預期的結果:

NSArray * arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"JLUViewController" owner:self options:nil]; 

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0]; 

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz]; 

上面的代碼不會崩潰或導致泄漏。儀器不報告泄漏,所以你會沒事的。

如果添加

[arrayOfTableCellView release]; 

雖然它會崩潰,報告EXC_BAD_ACCESS,因爲你試圖釋放你沒有自己的對象。注意我是如何讓NSArray成爲局部變量的?你應該這樣做,因爲你不需要它是一個屬性,因爲你只是在函數的範圍內使用它。另請不要說,如果arrayCellHeights是您的視圖控制器中的一個屬性,請始終使用self.arrayCellHeights來訪問它。

+0

好的 - 讓我再做一些測試。但當我最初沒有「保留」時,儀器宣佈泄漏。如果我「NSLog」數組的保留計數,它被設置爲1,我認爲它來自loadNibNamed。話雖如此,您在問題中的上述評論指出,我無法相信這個價值,因爲它是幕後的魔法價值。 – mobibob

+0

@mobibob:這是否讓你在任何地方? –

+0

我的崩潰是帶有應用程序內存佔用量的iOS4問題的副作用。顯然,與iOS4相比,iOS5爲初始發佈(x4或x10)分配更多內存。一旦我縮小了我的應用程序的初始大小,問題就消失了 - 一會兒。它後來因爲同樣的原因而崩潰,但在iOS5上永遠運行。試圖說服管理層:) – mobibob