5

我的 UITableView 正在返回EXEC_BAD_ACCESS,但是为什么!

看到这个代码片段!

加载 UITableView 工作正常,因此allXYZArray != nil已填充!

然后将 tableview 滚动到底部并备份会导致它崩溃,因为它会重新加载方法 cellForRowAtIndexPath

它在线失败:

    "NSLog(@"allXYZArray::count: %i", [allXYZArray count]);"

        (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
@try
{ 
if (allXYZArray == nil) {
   NSLog(@"nil");
   allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought];
}
NSLog(@"%i", [indexPath row]);
NSLog(@"allXYZArray::count: %i", [allXYZArray count]);
4

2 回答 2

10

EXC_BAD_ACCESS 表示您的程序正在尝试访问无效或无法从您的进程访问的内存地址。当您尝试向已解除分配的对象发送消息时,最常发生这种情况。所以调试 EXC_BAD_ACCESS 的第一步是找出当崩溃发生时你的程序试图向哪个对象发送消息。通常答案并不明显,在这种情况下,NSZombieEnabled是一个很好的工具,可以识别是哪一行代码导致了崩溃。

在您的情况下,您已经确定在您致电时发生了崩溃[allXYZArray count],这使allXYZArray我们成为主要嫌疑人。该对象是从 中返回的+[ToolBox getMergedSortedDictionaries:SecondDictionary:],因此您的错误很可能在该方法的实现中。我猜它返回的对象已经被释放而不是自动释放,正如Cocoa 的内存管理编程指南所规定的那样。(顺便说一句,这是 SDK 中最重要的文档之一。我建议每月重读一次,直到其政策和技术成为第二天性。)

于 2010-04-30T08:48:27.383 回答
1

好的,重用一个单元格,并不能保证单元格会被正确初始化:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];

单元格有时会为空(尤其是我猜的第一次)。

检查单元格是否为空,如果是,请正确初始化它。

if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
于 2010-04-29T08:19:14.220 回答