iOS5在UITableView中选择一个NSObject = EXC_BAD_ACCESS

问题描述:

我正在努力解决我一直试图修复3天的问题,而且我需要帮助。iOS5在UITableView中选择一个NSObject = EXC_BAD_ACCESS

在我的TicketTableViewController.m文件中,我创建了一个NSMutableArray的自定义NSObject(Ticket),每个Ticket都有值;

Ticket *ticketFound = [[Ticket alloc] initWithTicketNumber:ticketString locationNumber:locationString clerkNumber:clerkString approvedState:approvedState approvedDetail:approvedDetail totalNumber:[totalString floatValue] tipNumber:[tipString floatValue] balanceNumber:[subtotalString floatValue] ticketItemsArray:nil ticketItemsDict:nil]; 

我将这些添加到数组取决于票证的审批状态;

if ([approvedState isEqualToString:@"approved"]) { 
     [self.approvedTickets addObject:ticketFound]; 
    } 
    else if ([approvedState isEqualToString:@"declined"]) { 
     [self.declinedTickets addObject:ticketFound]; 

    } 
    else if ([approvedState isEqualToString:@""]){ 
     [self.openTickets addObject:ticketFound]; 
    } 

然后我加入这些阵列NSDictionary中的,然后向全球NSArray *ticketsthis tutorial;

NSDictionary *openDict = [NSDictionary dictionaryWithObject:self.openTickets forKey:@"tickets"]; 
NSDictionary *decDict = [NSDictionary dictionaryWithObject:self.declinedTickets forKey:@"tickets"]; 
NSDictionary *approvDict = [NSDictionary dictionaryWithObject:self.approvedTickets forKey:@"tickets"]; 

[self.tickets addObject:openDict]; 
[self.tickets addObject:decDict]; 
[self.tickets addObject:approvDict]; 

这一全球NSArray *tickets集,然后我就可以显示在切片的UITableView每票(按照教程)。我使用自定义单元格从数组中的每张票单中提取信息并显示它们;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

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

NSDictionary *dictionary = [self.tickets objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"tickets"]; 
Ticket *ticket = [array objectAtIndex:indexPath.row]; 

UILabel *locationLabel = (UILabel *)[cell viewWithTag:100]; 
locationLabel.text = [NSString stringWithFormat:@"Location: %@", ticket.locationNumber]; 
UILabel *ticketLabel = (UILabel *)[cell viewWithTag:101]; 
ticketLabel.text = [NSString stringWithFormat:@"Ticket: %@", ticket.ticketNumber]; 
UILabel *balanceLabel = (UILabel *)[cell viewWithTag:102]; 
balanceLabel.text = [NSString stringWithFormat:@"$%.2f", ticket.balanceNumber]; 

return cell; } 

这对我来说是完美的工作(虽然这个问题一旦解决就会出现另一个问题)。我的问题出现在用户从UITableView中选择一张票时。如果我尝试调用选定行中票据的任何部分数据,则应用程序崩溃时会出现EXC_BAD_ACCESS错误。这是我的代码;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  

NSDictionary *dictionary = [self.tickets objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"tickets"]; 
Ticket *ticket = [array objectAtIndex:indexPath.row]; 

NSLog(@"float: %@", ticket.balanceNumber); //this causes the crash } 

我知道我返回票(NSObject的),因为如果我把NSLog(@"class: %@", [ticket class]);,改变Ticket *ticket...id ticket...它返回一个票证(NSObject的)。

我明白任何建议。

在此先感谢。

问候,

编辑:这有什么事与我试图返回一个float和使用%@而非%f - 即使我尝试NSLog(@"ticketNumber: %@", ticket.ticketNumber);它是一个字符串,应用程序崩溃。

+0

那么它可能会崩溃,因为你没有使用%。2f在NSLog语句中。 – 2012-07-16 18:50:20

+0

另外,为什么你不只是让门票阵列的数组?我不明白你为什么把它们放在字典中,这似乎是一个额外的,不必要的步骤。只需让'[self.tickets objectAtIndex:[indexPath.section]]返回数组而不需要额外添加任意字典。 – 2012-07-16 18:53:52

+0

但是,我将如何分开不同的数组显示在部分?我只使用了一个NSDictionary,因为这就是教程使用的内容,工作流程似乎比我之前的“更紧密”。 – 2012-07-16 19:38:07

我明白了!我在我的自定义NSObject类中使用assign而不是retain,因为它的属性。感谢您的帮助!

+0

欢迎使用*。请记住稍后为未来的访问者接受您的答案。 – Shahbaz 2012-07-17 13:21:15

什么类型是balanceNumber?你是用%@打印/记录一个数字,如果它是一个双精度型,尝试%lf

我的猜测是Ticket类“balanceNumber”中的属性是float或decimal,因此你的nsLOG需要是这样的:当你的进程空间外访问内存

if float: 

NSLog(@"float: %f", ticket.balanceNumber); 

if decimal: 


NSLog(@"float: %d", ticket.balanceNumber); 
+0

感谢您的快速回复奥斯卡。对不起,我应该已经说得更清楚了。即使我尝试调用ticket.ticketNumber这是一个字符串,应用程序崩溃。 – 2012-07-16 19:35:50

一般来说,EXC_BAD_ACCESS发生,要么是因为内存已被释放,或者因为指针已被损坏指向某个进程空间之外。你没有提到你是否在这个项目中使用ARC,这会对可能的罪魁祸首产生一些影响。无论哪种方式,我会尝试运行NSZombieEnabled,看看是否有帮助。