1

我想,當程序獲取在「 - [CFString字符串respondsToSelector:]:消息發送到釋放實例」試圖訪問objectArray

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

我最後一排旁加載10行中的tableView數據時,使用帶pagenumber參數的單個函數來加載連續頁面。 它適用於首次提取,即頁面編號爲0,但是當我再次調用它來獲取下一個頁面的行,它給了我這個錯誤

-[CFString respondsToSelector:]: message sent to deallocated instance 

敲我的頭很長一段時間後,我發現,它創建嘗試訪問我的Model對象的NSMutableArray時出現此問題。 我使用這種方式:

TableRowObjectClass* TempObject = [[TableRowObject alloc] init]; 
for(int i=0;i<rowArray.count;i++){ 
    TempObject = [rowArray objectAtIndex:i]; 
    NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property I need from Object to be appended with some text from TableRowObject Class : %@",TempObject.objProperty] retain]; 
    [propertyArray addObject:objectProperty]; 
    [objectProperty release]; 
} 

在這裏我得到模型對象(TableRowObjectClass的對象)的數組,我想從TempObject提取OBJECTPROPERTY以及創建和所有這些屬性的陣列。 最初,對於pagenumber 0,它獲取20行,現在當我顯示第20行時,我調用fetch,它調用此函數創建一個全新的objectProperty Array,我呼叫[TableView reloadData]顯示20(舊)+20的frsh feed (新鮮)飼料。

現在它試圖訪問時產生這個錯誤

-[CFString respondsToSelector:]: message sent to deallocated instance 

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property ....TableRowObject Class: %@",TempObject.objProperty] retain]; 

我不知道什麼以及它從哪兒得到dealloc。 我已經花了很多時間在這方面,而我對objective-c內存管理並不太擅長。

非常感謝您的幫助。

+0

TableRowObject是一個類還是變量?你似乎正在使用它兩種方式。 – Chuck 2011-02-23 04:17:37

+0

它是一個擁有自己的init方法的類。它的對象是通過解析JSON數據創建的,並以這些對象的NSMutable數組的形式返回。 – Daffy 2011-02-23 04:29:01

+0

感謝您指出,我在上面的帖子中修復了它。這不是實際的代碼。 (不能粘貼確切的代碼,公司政策)我試圖展示功能,這與上面提供的代碼類似。 – Daffy 2011-02-23 04:40:40

回答

1

沒有必要使用

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property ....TableRowObject : %@",TableRowObject.objProperty] retain]; 

你甚至可以用

NSString* objectProperty = [NSString stringWithFormat:@"String Property ....TableRowObject : %@",TableRowObject.objProperty]; 
+0

我最初使用 (的NSString * OBJECTPROPERTY = [NSString的stringWithFormat:@ 「String屬性.... TableRowObject:%@」,TableRowObject.objProperty])僅 ,但在絕望解決這個缺陷,和沒有自動釋放任何對象,我用 (NSString * objectProperty = [[[NSString alloc] initWithFormat:@「String Property .... TableRowObject:%@」,TableRowObject.objProperty] retain];) 。 – Daffy 2011-02-23 04:26:25

+0

你在TableRowObject中有什麼樣的對象 – Swastik 2011-02-23 04:29:58

+0

我自己定義了這個類,它是一個從NSObject繼承的常規類。 – Daffy 2011-02-23 04:34:14

5

你的代碼非常清楚地表明,你不明白的Objective-C或Objective-C的內存管理;不用擔心,我們都開始了。首先閱讀Objective-C guide,然後Memory Management guide

一些具體問題:

TableRowObjectClass* TempObject = [[TableRowObject alloc] init]; 
TempObject = [someArray objectAtIndex: 0]; 

泄漏。在第一行分配的對象(該變量也應以小寫字母開頭)。

此:

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"..."] retain]; 
[objectProperty release]; 

雙保留由單個釋放,另一泄漏平衡。

您所看到的message sent to deallocated instance錯誤表示您過度釋放其他對象。遵循內存管理指南,使用「構建和分析」,然後使用殭屍檢測工具....

+0

感謝您的意見。 我遇到了另一個問題,我正在使用一個類方法並返回一個字典。但是,當我嘗試將它初始化爲autorelease時,應用程序崩潰,因爲它在另一個類方法中使用 – Daffy 2011-02-23 21:28:37

+0

從類方法或實例方法返回的對象使內存管理無關緊要。 .. – bbum 2011-02-24 07:37:16

相關問題