1

我的iPhone應用程序正在發生一些奇怪的事情。我正在使用Core Data將數據存儲在SQLite數據庫中。在我的應用程序啓動後第一次嘗試讀取表來返回所有行以填充UITableView以及用戶可供選擇的事物列表。如果他們選擇列表中的頂部項目,我會得到一個EXC_BAD_ACCESS異常。如果他們選擇任何其他物品,一切都好。以下是代碼示例:Sport和Team是NSManagedObjects。運動是使用NSFetchedResultsController(fetchedObjects)獲取的Sport對象的NSArray。我可以在UITableView中顯示微小物體的列表(我用的是同一個數組中的cellForRowAtIndexPath()調用沒有任何問題EXC_BAD_ACCESS ManagedObjects(核心數據)的NSArray

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    Sport *sport = (Sport *)[sports objectAtIndex:indexPath.row]; 

    if (teamSetup) { 
     if (team.sport != sport) { 
      [team setSport:sport]; <-- this is where the EXC_BAD_ACCESS happens 

      NSError *error; 
      [team.managedObjectContext save:&error]; 
     } 
     [self.navigationController popViewControllerAnimated:YES]; 

    } else { 
     // .. do some other stuff 

    } 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

更新:它似乎隻影響在NSArray中的最後一條記錄,而不是第一直到它拋出EXC_BAD_ACCESS錯誤再次重新啓動應用程序後,問題消失,代碼按預期工作:(

回答

0

上面的行沒有任何錯誤EXC_BAD_ACCESS發生但是,它可以提供一個線索,問題與teamsport對象有關,首先要追究的是其中一個對象已被釋放,因爲它沒有被重新分配充分利用。

發佈的對象可能無法立即釋放。這就是爲什麼EXC_BAD_ACCESS可能發生在奇怪的時代。只有當它們使用的內存塊不再需要時纔會釋放這些對象。其他對象當然會使用相同的塊。所以,當這個塊有資格取消分配時,就像開發人員一樣無法控制。這由運行時處理。

最好的事情是首先運行分析儀,然後運行儀器,使用Leaks儀器進行分析。

有這一切對婁佛朗哥的網站跟蹤EXC_BAD_ACCESS錯誤很好的解釋,並逐點建議:

Understanding EXC_BAD_ACCESS

相關問題