如何解决此“无法识别的选择器发送到实例”错误?

Posted

技术标签:

【中文标题】如何解决此“无法识别的选择器发送到实例”错误?【英文标题】:How can I resolve this 'unrecognized selector sent to instance' error? 【发布时间】:2011-02-08 02:56:54 【问题描述】:

错误为Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MObject objectAtIndex:]: unrecognized selector sent to instance。所以,我从中得到的是 MObject 的一个实例(NSObject 的一个子类)正在接收一个它不打算处理的 objectAtIndex: 消息。

当我点击表格行以转到其详细视图时发生错误,该视图由 UIWebView detailWebView 组成。 didSelectRowAtIndexPath的代码如下:

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

MObjectDetailVC *mObjectDetailVC = [[MObjectDetailVC alloc] initWithNibName:@"MObjectDetailVC" bundle:nil];
mObjectDetailVC.detailURL = [[NSURL alloc] initWithString:[[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] url]];
mObjectDetailVC.title = [[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] name];
[self.navigationController pushViewController:mObjectDetailVC animated:YES];
[mObjectDetailVC release];

它采用MObject 的选定实例的NSString url 属性并将其转换为详细视图控制器的NSURL,它只执行基本的[detailWebView loadRequest:[NSURLRequest requestWithURL:detailURL]]

如果您有任何建议,我会很高兴听到他们的意见。如果您需要更多信息,请告诉我。

【问题讨论】:

mcData的结构是什么?真的是 NSArray 的 NSArray? mcData 是由一堆MObject 组成的NSArray。那么,不是每个项目都是数组中的NSObject,而是每个项目都需要是数组中的NSArray 【参考方案1】:

看看mcData的结构。根据您的代码,它及其成员应该是 NSArrays,请确保它们是。

【讨论】:

mcData 是由一堆MObject 组成的NSArray。那么,您的意思是不是每个项目都是数组中的NSObject,而是每个项目都需要是数组中的NSArray 代码目前的写法,也就是预期的,是的。请参阅[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] 行,它需要一个数组中的数组。 嗯,这不是我想要的。如何更改它以使其不查找嵌套数组,而仅从所选对象中获取 urlname?或者这可能吗? 我猜[mcData objectAtIndex:indexPath.row] 本身就可以解决问题。这假设您有一个包含单个部分的表格。 太棒了,解决了这个错误。不过,我现在还有一个。 “未设置查看出口。”感谢您的帮助!【参考方案2】:

objectAtIndex:NSArray 上定义。如果MObject 类是NSObject 的子类,则它不会定义objectAtIndex: 方法,这就是错误所说的。

以下两个调用都会导致崩溃:

mObjectDetailVC.detailURL = [[NSURL alloc] initWithString:[[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] url]];
mObjectDetailVC.title = [[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] name];

确保mcData[mcData objectAtIndex:indexPath.section] 返回NSArray 或其子类的对象。

【讨论】:

【参考方案3】:

您可以通过 respondsToSelector 进行检查以防止崩溃:

您可以在以下位置阅读更多信息 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

在传递特定消息之前进行检查将帮助您避免崩溃。

【讨论】:

以上是关于如何解决此“无法识别的选择器发送到实例”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 [__NSCFString _isResizable] 的运行时错误:无法识别的选择器发送到实例?

获取常量值:无法识别的选择器发送到实例错误

错误:无法识别的选择器发送到实例

控制器视图停止动画无法识别的选择器发送到实例

Swift无法识别的选择器发送到实例错误

pushwoosh 错误无法识别的选择器发送到实例 Cordova 1.7.0