UITableView cellForRowAtIndexPath中的EXEC_BAD_ACCESS

时间:2010-04-29 02:23:44

标签: ios iphone uitableview exc-bad-access

我的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]);

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

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

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];

单元格有时会为空(特别是我第一次猜测)。

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

if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];