2009-07-18 77 views
0

我有一些(我認爲)用於從數據源創建單元格內容的非常基本的代碼,並且在顯示加載時一切正常。但是,當我開始滾動瀏覽其他文本(向上或向下)時,代碼失敗,'GDB:程序接收信號:「EXEC_BAD_ACCESS」'。以下是填充各部分顯示的代碼;每個部分都有類似的代碼:單元格開始向後滾動時出現「EXC_BAD_ACCESS」錯誤?

id cell = (UITableViewCell *)[tableView 
    dequeueReusableCellWithIdentifier:CellIdentifier 
]; 

titledCell = [[[TitledCell alloc] 
      initWithFrame:CGRectZero 
     reuseIdentifier:CellIdentifier 
    ] autorelease 
]; 

switch (tableSection) { 
    case TABLE_SECTION_1: 
     if (cell == nil) { 
      dataKey = @"a key from data source"; 
      dataFromSource = [viewData objectForKey:dataKey]; 

      titledCell.title.text = dataKey; 
      titledCell.contents.text = dataFromSource; 
      cell = titledCell; 
      break; 
     } 
    case TABLE_SECTION_2:   
    ... 
} 
return cell; 

當我在下面的代碼,我注意到,滾動單元格時回到視圖中,因爲電池=零代碼跳過細胞創造!如果它跳過,這意味着單元格包含與第一次創建相同的內容,對吧?爲什麼給我麻煩?

+0

檢查調試器窗口以及控制檯將會有所幫助 – ennuikiller 2009-07-18 21:54:02

+0

您應該真正遵循您在iPhone和Mac OS X示例代碼中看到的規範Objective-C編碼風格;它會讓你的代碼更易於閱讀和幫助你。 – 2009-07-19 01:01:03

+0

好點,克里斯,我已經改變了一下 - 雖然我不是很熟悉規範的Objective-C風格,所以它可能不太正確。我會努力的。 – JoBu1324 2009-07-21 23:48:14

回答

1

當我忘記保留某些東西時,我通常會得到EXEC_BAD_ACCESS。如果你有一個autorelased對象,它可能會第一次通過,但不是第二次工作。

在調試中運行該程序,並使用Xcode找出它崩潰的線路。這比其他任何事情都會更有幫助。

1

我覺得造成的EXEC_BAD_ACCESS威力:

titledCell.title.text = dataKey; 

titledCell可能會dealloced和訪問屬性時,就會有一個EXEC_BAD_ACCESS例外。

您可以打開NSZombieEnabled ENV virable在:&組文件 - > Extutables - >您的應用程序 - >獲取信息 - >參數

+0

對不起,編輯這個答案不相關(我編輯它,因爲你發佈了你的答案;我開始調查這種可能性,並發現真正的問題是什麼,所以我更新了所有相關代碼的問題,無論如何感謝您的幫助! +1,因爲這是我發佈的代碼的「最佳猜測」! – JoBu1324 2009-07-18 22:31:16

1

不能肯定與你給的代碼示例100%但一個好的猜測是break語句在if塊內。所以它應該看起來像:

switch(tableSection) { 
    case TABLE_SECTION_1: 
      if(cell == nil) { 
        dataKey = @"a key from data source"; 
        dataFromSource = [ viewData objectForKey:dataKey ]; 

        titledCell.title.text = dataKey; 
        titledCell.contents.text = dataFromSource; 
        cell = titledCell; 
      } 
      break; 
    case TABLE_SECTION_2:   
    ... 
} 
0

不幸的是,變化使這個問題成爲學術問題,所以我無法確定是否有任何答案是正確的。當前的代碼看起來有點接近這個:

id cell = (UITableViewCell *)[tableView 
     dequeueReusableCellWithIdentifier:CellIdentifier 
]; 

if (cell == nil) { 
     titledCell = [[[TitledCell alloc] 
        initWithFrame:CGRectZero 
       reuseIdentifier:CellIdentifier 
      ] autorelease 
     ]; 

     switch (tableSection) { 
      case TABLE_SECTION_1: 
       dataKey = @"a key from data source"; 
       dataFromSource = [viewData objectForKey:dataKey]; 

       titledCell.title.text = dataKey; 
       titledCell.contents.text = dataFromSource; 
       cell = titledCell; 
       break; 
      case TABLE_SECTION_2: 
      ... 
} 
return cell; 

...所以大部分的代碼是目前在「如果(細胞==無)」塊(這更有意義),和它的作品精細。我希望我明白什麼是錯的,但是謝謝你的答案!

相關問題