2009-11-29 122 views
5

我有一個TableView建立並繪製好,但然後在滾動視圖崩潰。我已經運行了調試器,看起來我的類級別的變量正在被覆蓋,所以當再次調用titleForHeaderInSection時,它們不再存在。非常奇怪的是,如果我替換代碼:UITableView在滾動崩潰

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section]; 
return sectionTitle; 
} 

有:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = @"Test"; 
return sectionTitle; 
} 

它仍然崩潰,但這次調試器列表中沒有一個NSString當你將鼠標懸停在sectionTitle變量。

這是我用來創建視圖的代碼,並設置類級別的變量:

- (void)loadView { 
[super loadView]; 
CGRect tableSize = CGRectMake(0,0,320,460); 
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain]; 
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); 
favouritesTableView.dataSource = self; 
favouritesTableView.delegate = self; 
favouritesTableView.rowHeight = 52; 
[self.view addSubview:favouritesTableView]; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
// Get the full path of the favourites plist 
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"]; 
// Initialise Dictionary and array 
favouritesDataAll = [[NSMutableDictionary alloc] init]; 
favouritesDataSections = [[NSArray alloc] init]; 

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain]; 
favouritesDataAll = dict; 
[dict release]; 

favouritesDataSections = [favouritesDataAll allKeys]; 
} 

我會絕對瘋狂試圖跟蹤下來 - 了2天就可以了到目前爲止,一切會對外感謝任何幫助。

問候

戴夫

+0

OK,如果我把在在的UITableView行它適用於約3或四次到底保留,然後控制檯提供: *** - [UISwipeGestureRecognizer長]:無法識別的選擇發送到實例0x43325d0 – 2009-11-29 08:30:13

+0

和還有: ***由於未捕獲的異常「NSRangeException」而終止應用,原因:'*** - [NSCFArray objectAtIndex:]:index(0)beyond bounds(0)' – 2009-11-29 08:35:37

+0

好的,我會閉嘴的。我認爲保留是我的紅鯡魚。這是因爲我將titleForHeaderInSection替換爲@「Test」,它已經工作了一段時間。控制檯錯誤是: ***終止應用程序由於未捕獲的異常'NSRangeException',原因:'*** - [NSCFArray objectAtIndex:]:索引(57744)超出界限(2)' – 2009-11-29 08:39:51

回答

12

OK,固定它...變化

favouritesDataSections = [favouritesDataAll allKeys]; 

要:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

而這一切似乎工作。從這裏我可以推斷出,我用來存儲節標題的數組指向的是在某個隨機點自動釋放的數據,這就是爲什麼它在看似奇怪的地方進行了測試。

雖然我確實承認自己仍然處於編碼的「試錯階段」,並沒有完全理解自己在做什麼(我相信您會不約而同地閱讀本文)。如果你有進一步閱讀的任何想法/意見鏈接或關於這些工作如何工作的帖子(即何時和爲什麼使用保留等)以進一步理解,對我來說是有用的。再次

謝謝,戴夫

+0

Dave,請閱讀Apple文檔中的內存管理規則。如果你先做了一些閱讀,這是一個基本的錯誤,你不會這麼做。 – NSResponder 2009-11-29 15:38:29

+0

非常有用。我有類似的問題。謝謝!!!! – saimonx 2011-11-03 17:30:36

0

聽起來像有某種內存損壞會在這裏的。

我看到的一件事是,那些對[super ...]的調用應該發生在這些方法中的其他代碼之後。

如果你調整你的tableview只有一個部分會發生什麼?

+0

您好格雷格,感謝您的快速回復。不幸的是,把超級放在最後導致它崩潰(即,TableView甚至沒有繪製)。我也嘗試手動設置節數爲1,節的行數爲1,節標題爲@「測試」。仍然在滾動上崩潰。 – 2009-11-29 08:57:58

4

我會建議使用@property setters來避免這個問題,數組會被自動釋放,所以你所謂的手動保留就可以了,這解決了這一問題,但一個簡單的解決將是使用方法:

self.favoritesDataSection

這是通過自動@property(保留) 保留手段保留當該設定被調用,並且當它被設置爲nil或不同的對象釋放。