2011-03-03 73 views
2

希望你能幫助我用這個... 我目睹了一些目標C中的瘋狂行爲,但這一個讓我自殺。好吧,不是真的...iphone -message發送到釋放的實例

這是一個尋址解除分配的對象問題。

情景: 我已經加載了RSS feeds的tableView,選擇該行後打開DetailView並在UIWebView中顯示feed。因爲我需要在DetailView內滑動上一個和下一個Feed的函數,所以我使用NSMutableDictionary初始化DetailView,它包含以下內容:1)NSMutableArray包含關鍵所有(15)提要的NSMutableArray:@「items」和
2)NSNumber positionInArray具有在TableView中選擇的行的索引。

後者我需要這樣我可以通過保持數組索引值可以實現刷新到上一個和下一個feed。有了這個值可以裝入positionInArray-1或positionInArray + 1 ...

在我的TableView我:

現在
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
//Call an action only if the pressed cells are not the adMob ones 
if (indexPath.row != 0) { 
    NSMutableDictionary *theItem = [[NSMutableDictionary alloc] init]; 
    [theItem setValue:items forKey:@"items"]; 

    //Add the position of item in the items array to the NSDictionary for current item so it can be 
    //used in nextController to scroll to prev and next 

    NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1]; 
    [theItem setValue:positionInArray forKey:@"positionInArray"]; 

    DetailController *nextController = [[DetailController alloc] initWithItem:theItem]; 
    [self.navigationController pushViewController:nextController animated:YES]; 

    [nextController release]; 
    [positionInArray release]; 
    [theItem release]; 

}  

,一切正常。我在TableView中選擇一行,打開DetailView並顯示提要。左右滑動顯示所有提要沒有問題。但!如果我選擇最後的飼料或最後TableView中一前一,飼料呈現像往常一樣,但然後如果我嘗試向左或向右滑動我收到以下錯誤:

2011-03-03 10:50:15.039 RssReader[72137:207] Swipe Right Movement done! 
2011-03-03 10:50:15.041 RssReader[72137:207] *** -[CFNumber intValue]: message sent to deallocated instance 0x6240460 

我試着讓殭屍和衛隊的malloc但是這是我得到的唯一的事情...

的問題的解決方案是真正讓我覺得我即使明白內存分配/釋放是指:對
如果我刪除線[positionInArray release][theItem release]應用將工作沒有任何問題?怎麼樣?爲什麼?哦爲什麼?

我可以假裝我明白,如果我釋放positionInArray對象,它不能傳遞給其他對象內部的NSMutableDictionarytheItem。我說假裝,因爲我認爲它使用它的副本(通過分配)。

而且,我無法理解的是:

  1. 它爲什麼13工作飼料,我加載和最後兩個是不?

  2. 爲什麼如果我不釋放該項目對象會工作?我的意思是僅僅在那個對象上面有幾行被用來初始化* nextController,並且我在那裏製作了一個本地副本來處理它呢?

如果您需要了解更多信息,請詢問有什麼可以幫助你,我肯定會提供它...提前 感謝, 大號

回答

2

這些線是你的問題:

NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1]; 

[positionInArray release]; 

您是alloc/init荷蘭國際集團所有其他變量。這意味着你有責任釋放它們。對於NSNumber實例,您並未致電alloc,因此您不負責釋放它,它是自動釋放的。通過自己釋放它,這意味着在應用程序的後期某個地方,當自動釋放池被耗盡時,它將被第二次釋放,從而導致難以調試的錯誤。

欲瞭解更多詳情,請閱讀the Memory Management Programming Guide

+1

非常感謝您的支持。我解決了它,因爲你可以在我的第一篇文章中看到,但我不知道爲什麼會發生此錯誤。我應該看到了這一點,但我認爲這只是_NSString_對象,不需要釋放。問題是爲什麼在打開前13個Feed時打開DetailView而不是後兩個打開時,滑動功能是否工作?如果您再次閱讀我的第一篇文章,您會發現只有打開最後兩個Feed中的一個並從左/右滑動時纔會出現問題。 – luigi7up 2011-03-04 08:29:09

1

刪除線[positionInArray release];

該變種不保留,它是自動釋放的。

0

你不需要發佈positionInArray。它的自動發佈。

相關問題