应用程序执行表委托方法时崩溃

时间:2013-05-17 06:37:59

标签: ios objective-c uitableview

当我在aepub阅读器中运行搜索功能时,我的应用程序崩溃了。它以index方式进入cellfor行,当它执行NSLOg(@"%@",hit.neighbourText)时,它显示异常。

    (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }

        cell.textLabel.adjustsFontSizeToFitWidth = YES;

        NSLog(@"indexpath%d",indexPath.row);
        NSLog(@"%@",[results objectAtIndex:[indexPath row]]);

        hit = (SearchResult*)[results objectAtIndex:[indexPath row]];

        if([results count]>0) {
            NSLog(@"%@",hit.neighboringText);
            cell.textLabel.text = [NSString stringWithFormat:@"...%@...", hit.neighboringText];
            cell.detailTextLabel.text = [NSString stringWithFormat:@"Chapter %d - page %d", hit.chapterIndex, hit.pageIndex+1];

           return cell;
        }
    }

我为hit.neighboringText获得了一些价值,但在那之后,我重新加载我的tableview然后会引发以下异常,为什么?

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString   adjacentText]:无法识别的选择器发送到实例0x1481c4'       ***首先抛出调用堆栈:

4 个答案:

答案 0 :(得分:5)

这是因为hit实际上是NSString对象,而不是您期望的SearchResult对象:

hit = (SearchResult*)[results objectAtIndex:[indexPath row]];

线索在异常文本中:

-[__NSCFConstantString neighboringText]: unrecognized selector sent to instance ...
  ^^^^^^^^^^^^^^^^^^^^                   ^^^^^^^^^^^^^^^^^^^^^

SearchResult的任何投射量都不会改变它。

编辑:实际上,只要你看到演员阵容,就应该怀疑你正在处理的实际对象。如果您不确定,请使用isKindOfClass:进行检查。

答案 1 :(得分:0)

您的问题的答案在于错误消息:

  

无法识别的选择器发送到实例0x1481c4。

接下来需要做的是通过po 0x1481c4打印该地址的值。看起来它实际上不是一个字符串,但你没有显示该代码。

答案 2 :(得分:0)

这意味着hit = (SearchResult*)[results objectAtIndex:[indexPath row]];返回ConstantString而不是SearchResult对象

在从hit获取值之前,最好检查neighboringText是否与SearchResult属于同一类类型

你可以尝试这样的事情:

if([hit isKindOfClass:[SearchResult Class]]){
  // do something with hit
}
else{
// different class
}

答案 3 :(得分:0)

我猜有两种可能性:

  • hit不是SearchResult对象,而是String对象
  • hitresults数组不再拥有/已发布但未设置为nil并指向垃圾,我相信是这种情况因为我之前已经经历过

我认为你需要确保数组在那时没有自动释放/释放(例如,如果你使用[NSArray arrayWith...]创建它,它是自动释放的,你可能不会在cellForRowAtIndexPath中拥有它)和命中在将对象提供给results数组之前,对象已正确初始化。