didSelectRowAtIndexPath生成EXC_BAD_ACCESS,而willSelectRowAtIndexPath工作正常UITableView

问题描述:

我开始与iPhone开发,并有一个编程UITableView是一个常规的UIViewController的子部分的问题。didSelectRowAtIndexPath生成EXC_BAD_ACCESS,而willSelectRowAtIndexPath工作正常UITableView

的问题:。

当攻一排,在didSelectRowAtIndexPath方法产生EXC_BAD_ACCESS(我检查了正确的方法签名而如果我提出这个方法的身体willSelectRowAtIndexPath它工作正常,这似乎是错误的对我来说,因为所有的文档/模式都使用didSelectRowAtIndexPath。好的,真正奇怪的是该方法是否被调用。当然,如果下面的日志输出没有记录,那么该方法没有运行,所以我可以把任何代码编译在那里,它不会运行。那么为什么是异常呢?另外,我发现很难确认它是否与一个过早释放的对象有关,因为当移动到willSelectRowAtIndexPath时程序运行良好。也许有一些对象(重新)分配i意志和阶段之间?

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
     CommentViewController *commentViewController = [[CommentViewController alloc] initWithNibName:@"CommentViewController" bundle:nil]; 
     Comment *selectedComment = [[Comment alloc] init]; 
     selectedComment = [self.message.comments objectAtIndex:indexPath.row]; 
     commentViewController.comment = selectedComment; 

     [self presentModalViewController:commentViewController animated:YES]; 

     [selectedComment release]; 
     [commentViewController release];  
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
     NSLog(@"This method is never called ... as I don't see this log output ... "); 
} 

的设置:

的UITableView的如在IB的元素创建的,并且被连接为在UIViewController中的参考变量。 UIViewController被设置为数据源和UITableView的委托。到目前为止,UIViewController视图加载,并且UITableView正确加载了单元格。这意味着数据源的委托方法至少可以正常工作。

下一步:

所以现在我想点击一行,并加载了另一个视图(无论是模态或什么的,它不真正的问题现在)和BOOM,与EXC_BAD_ACCESS模拟器崩溃报道安慰。

真的可以使用这个指针。感谢一个工厂提前给你的帮助!

马特

didSelectRowAtIndexPath,因为你勾起willSelectRowAtIndexPath:模态的视图,其冻结的tableview,并防止它发送消息到其委托/数据源是永远不会被调用在上面的代码。

这里是你崩溃的原因:

Comment *selectedComment = [[Comment alloc] init]; // creates new object 
    selectedComment = [self.message.comments objectAtIndex:indexPath.row]; // assigns a different existing object. Newly created object never used and leaking 
    commentViewController.comment = selectedComment; // set to assigned existing 

    [self presentModalViewController:commentViewController animated:YES]; 

    [selectedComment release] // BINGO! you release the assigned object 

你的崩溃是由上面的BINGO线引起的。您将已初始化的Comment对象与数组返回的其他完全不相关的Comment对象混淆。您释放从数组返回的对象Comment,而不曾保留它。该对象然后死亡,任何尝试访问它随后导致崩溃。

+0

嗨TechZen,感谢您的帮助工厂。我似乎已经遭受了两件事,确实是你的建议有帮助,我将代码移回到了......并完全移除了意愿...方法。我也有一个奇怪的结果,我的断点没有得到尊重,我在这里调用(http://www.innerexception.com/2008/05/in-xcode-orange-breakpoint-means-gdb.html)。最后,这个方法实际上会中断,我可以检查发生了什么。我现在仍然不是100%,为什么它现在可以工作,而不是当我最初使用的时候...确实呈现模式。 Anyhoo感谢您的帮助! – Matthew 2010-08-09 12:54:57