在我写的一个方法中,我正在声明一个类'A'的实例并在其上调用一个方法。在运行时,当该方法运行时,我的应用程序崩溃。它说一个无法识别的选择器被发送到类'B'的实例,即使我声明了一个'A'的实例。我在某处读到我可能无法正确管理我的内存所以它正在将该方法发送到另一个类,但我使用的是ARC,因此它甚至不应该是一个问题。非常感谢帮助!
The error I'm getting:
2011-08-27 01:25:49.859 Intelligenda[49385:bc03] PVC: <HomeViewController: 0x59359e0>
2011-08-27 01:25:49.945 Intelligenda[49385:bc03] -[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0
2011-08-27 01:25:49.947 Intelligenda[49385:bc03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0'
以及被调用的方法:
-(IBAction)done:(id)sender{
[teacherName resignFirstResponder];
[className resignFirstResponder];
IntelligendaAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
UINavigationController *nav = delegate.navController;
[nav popViewControllerAnimated:YES];
ClassesViewController *classesParentViewController = (ClassesViewController *) nav.topViewController;
ClassIG *theNewClass = [[ClassIG alloc] init];
theNewClass.className = className.text;
theNewClass.teacherName = teacherName.text;
NSIndexPath *indexPath;
theNewClass.subject = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;
// add reminder to array
NSLog(@"PVC: %@", [classesParentViewController description]);
[classesParentViewController addNewClass:theNewClass];
}
答案 0 :(得分:1)
例如,声明指针NSArray* fred
不执行任何操作(除了编译时编译时警告消息),以确保fred
是NSArray
。这是您分配给fred
的重要内容。如果您指定NSDateFormatter
,那就是fred
。
答案 1 :(得分:1)
您假设应用程序代理的导航控制器顶部有ClassesViewController
,这显然存在缺陷。它顶部有HomeViewController
。你的结构看起来可能有点复杂,因为你在控制器类的其他部分有一个连接到某个动作的按钮,所以可能有一堆因果关系。
要检查的第一件事:如果您以编程方式实例化按钮,那么您是否意外地将按钮添加到错误的控制器?如果您使用图形界面设计器设计所有内容但将其保存在单个NIB中,是否可以复制并粘贴按钮并忘记更改其连接的内容?
如果您最终可以使用多个导航控制器,您确定应用程序代表所持有的导航控制器当前在屏幕上吗?
答案 2 :(得分:0)
简短的回答是类型转换和类型转换是objc中程序员的练习。
在这里阅读我的答案:
Passing NSNumber* to NSString* expected-parameter does not cause compiler warning / error
...有关如何声明/转换对象变量与其他语言不同的更多信息,以及如何检测这些情况。