如何解决此“无法识别的选择器发送到实例”错误?
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]
行,它需要一个数组中的数组。
嗯,这不是我想要的。如何更改它以使其不查找嵌套数组,而仅从所选对象中获取 url
和 name
?或者这可能吗?
我猜[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
在传递特定消息之前进行检查将帮助您避免崩溃。
【讨论】:
以上是关于如何解决此“无法识别的选择器发送到实例”错误?的主要内容,如果未能解决你的问题,请参考以下文章