iPhone应用程序冻结

| 使用iPhone模拟器2.2.1 使用表格并想向选中的单元格添加一个复选标记。 我从确实适用于其他应用程序但使用相同方法的应用程序中添加了此代码段。现在,此新代码将编译并启动,并在选中的单元格中添加了对勾标记,并在几秒钟后冻结了该程序。 *此代码节来自有效的应用程序。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

***This snippet was added (from another working app)

    if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];    
        else 
        [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
    [self performSelector:@selector(deselect) withObject:nil afterDelay:0.5f];

***End of snippet

}
我为控制台添加了一些printf语句,并且通过if语句并在最后一行之后执行该操作。 因此,它可以在没有代码段的情况下工作,如果我添加了代码段,它可以编译,启动,并在选择一项后出现复选标记,该应用程序将冻结。 下面是来自控制台的错误消息。
*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750
2011-04-16 16:15:30.132 lab3[37268:20b] *** Terminating app due to uncaught exception \'NSInvalidArgumentException\', reason: \'*** -[RootViewController deselect]: unrecognized selector sent to instance 0x526750\'
    
已邀请:
答案出在错误消息中:没有对象
RootViewController
的选择器ѭ2selector,在您的代码(和代码段)中用represented4ѭ表示。方法“ 2”必须是在其他程序中定义的方法,但不能在当前应用程序中定义。从其他程序中剪切并粘贴,我敢打赌这可以解决问题。 另一个提示(与问题无关,但使用此处的代码):如果在if语句之前声明局部变量,然后在if语句中使用该变量,则可以避免对
cellForRowAtIndexPath:
的所有调用。
UITAbleViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if ([cell accessoryType] == UITableViewCellAccessoryCheckmark)
    ....
解决其他问题后,您的绩效将会提高。     
您正在向
self
发送一条
-deselect
消息,这显然是RootViewController的一个实例。但是,您的RootViewController类没有-deselect方法,因此会引发异常,从而导致错误。因此,要么停止将
-deselect
发送到
self
,要么将
-deselect
方法添加到RootViewController。 顺便说一句,对NSInvalidArgumentException的搜索会出现很多类似的问题,因此您根本不必等待答案。     

要回复问题请先登录注册