iOS-出现奇怪错误:无法识别的选择器发送到UITableView上的实例

iOS-出现奇怪错误:无法识别的选择器发送到UITableView上的实例,ios,uitableview,custom-controls,unrecognized-selector,Ios,Uitableview,Custom Controls,Unrecognized Selector,导言 在我当前的应用程序中,我有一个UITableView,它保存自定义单元格对象。自定义UIViewCell对象只是标准UITableViewCell类的子类。自定义单元格保存有关运行后台上载的信息,并使用完成百分比等更新这些信息 自定义单元格对象侦听后台运行的上载进程发出的通知,当收到相关通知时,它们只需使用新信息(例如上载百分比)更新自己的视图控件 现在,当上传过程完成时,我会对活动上传对象数组重新排序,然后像这样重新加载tableview: -(void) uploadFinished:

导言

在我当前的应用程序中,我有一个UITableView,它保存自定义单元格对象。自定义UIViewCell对象只是标准UITableViewCell类的子类。自定义单元格保存有关运行后台上载的信息,并使用完成百分比等更新这些信息

自定义单元格对象侦听后台运行的上载进程发出的通知,当收到相关通知时,它们只需使用新信息(例如上载百分比)更新自己的视图控件

现在,当上传过程完成时,我会对活动上传对象数组重新排序,然后像这样重新加载tableview:

-(void) uploadFinished: (NSNotification*)notification
{
    NSDictionary *userInfo = [notification userInfo];

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"];

if (uploadID.integerValue == uploadActivity.uploadID)
{   
    [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity];
    [parentTable reloadData];

    [self setUploadComplete];
}
}
    UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"];

if (cell == nil)
{
    [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil];

    cell = customCell;
}
现在,这个方法发生在tableviewcell对象中,正如您所看到的,它们在数组排序后立即调用自己的UITableView来重新加载数据。markUploadAsFinished方法只是对数组重新排序,以便将任何新完成的上载放在顶部,因此它将以这种方式显示在UITableView中

问题

现在我遇到的问题是,调用此方法时,有时会出现以下错误: “NSInvalidArgumentException”,原因:“-[CALayer tableView:numberOfRowsInSection::发送到实例的选择器无法识别

我不是一直都能理解它,有时整个过程运行正常,完成的上传会出现在UItableview的开头,而在其他看似随机的时间它会失败。我真的不知道这里发生了什么

自定义单元格是从.NIB文件加载的,如下所示:

-(void) uploadFinished: (NSNotification*)notification
{
    NSDictionary *userInfo = [notification userInfo];

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"];

if (uploadID.integerValue == uploadActivity.uploadID)
{   
    [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity];
    [parentTable reloadData];

    [self setUploadComplete];
}
}
    UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"];

if (cell == nil)
{
    [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil];

    cell = customCell;
}
有人知道这里发生了什么吗

编辑

首先,我跟踪了此错误,并将其显示在以下行中: 重新加载数据

在自定义单元格对象内部调用

此外,它向其发送方法的实例似乎可以更改。我刚才也犯了这个错误:

'NSInvalidArgumentException', reason: '-[UIScrollViewPanGestureRecognizer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance

我真的不知道这里发生了什么。

据我所知,你在后台运行上载进程方法,我认为是主线程以外的其他线程。据我所知,当你处理UIKIT对象时,你会破坏主线程

但这些问题并不是每次都会发生,因为有时您会切换到其他线程到主线程,所以工作正常,有时则不会。所以问题就出现了

'-[CALayer tableView:numberOfRowsInSection:]:发送到实例的选择器无法识别


你的指针不好。看起来您的表的数据源正在释放,而该表仍然存在。该表不保留其数据源,因为这可能会创建一个保留周期。如果在表使用数据源时不注意保持数据源,则该表可能会出现一个指向不再存在的对象的指针。在本例中,看起来随后将在同一地址创建CALayer对象。当表稍后向其“数据源”发送一条消息以获取行数时,该消息被传递到层,该层(显然)没有
-tableView:numberOfRowsInSection:
方法和错误结果。

在哪里设置表视图的
数据源
?失败时,它似乎被设置为
CALayer
实例。tableview的数据源设置在名为“ActiveUploads”的.nib文件中。这个.nib文件只包含一个包含UItableview本身的UIView。UITableView datasource+委托随后被设置为.nib文件的文件所有者,文件所有者是处理上述创建的UIViewController。您是否在启用僵尸的情况下运行?可能与您的问题无关,但似乎值得指出的是:如果您的上载数量超过一个屏幕上的单元格数量,可能没有单元格跟踪上载,因此没有人会在
ApplicationActivities
对象中调用
markUploadAsFinished
。这在将来可能会成为问题,也可能不会成为问题,这取决于
markUploadAsFinished
的功能。啊,是的,很好的理解,这可能会成为一个问题。MarkUploadAsFinished是一种方法,它将uploadActivity对象点到并在uploads内部数组中对其重新排序,以便它跳到tableview的顶部。我想没有什么真正的办法可以解决这个问题?也许最好还是让单元格保持原来的位置,这样用户在查看视图时就不会感到困惑了。谢谢,但是我已经解决了这个问题:)只要Stackoverflow允许我回答我自己的问题,我就会发表一篇文章:)这不是因为线程安全问题,因为底层上传对象使用标准的NSURLConnection异步方法,该方法处理回主线程的同步。啊哈!这就是原因!正如你说的,我确实发现原因是一个错误的指针,虽然我仍然不确定根本原因,但这澄清了它:)谢谢!