我以前从未见过这个回复,同一个动作在同一个应用程序的不同运行中会引发不同的错误。
我在一个NSViewController子类中有一个按钮(只记录发件人)的IBAction,它会在单击按钮时抛出错误(这是一个OSX应用程序)。我得到了这些(到目前为止):
-[NSArrayM buttonClick:]: unrecognized selector sent to instance
-[__NSCFDictionary buttonClick:]: unrecognized selector sent to instance
-[__NSCFSet buttonClick:]: unrecognized selector sent to instance
-[NSRunLoop buttonClick:]: unrecognized selector sent to instance
而且,可怕的EXC_BAD_ACCESS。
此测试应用程序中唯一的代码是在app委托中实例化视图控制器:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
TestController *controller = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];
[self.window.contentView addSubview:controller.view];
}
这个IBAction在视图控制器子类中:
-(IBAction)buttonClick:(id)sender {
NSLog(@"%@",sender);
}
在视图控制器中实现的IBAction在IB(通过文件所有者)连接到其视图中的按钮。
我无法理解如何在如此简单的程序中获得如此多的不同错误消息。这可能是视图控制器不在响应链中的问题吗?如果是这样,为什么它应该抛出错误,消息是否应该被发送到链中然后被丢弃?
我已经尝试让控制器的视图将控制器设置为下一个响应者(使用[controller.view setNextResponder:controller];),但这只是在启动时给出了EXC_BAD_ACCESS错误。
答案 0 :(得分:0)
好的,我用来自Shane Stanley的指针修复了这个问题(我在ApplescriptObjC上做了另一个版本来询问那里的问题,但那个版本有效)。这是一个内存管理问题 - 使用ARC时很容易忘记。在我向其发送IBAction之前,TestController实例正在被释放。这解释了变量错误消息,因为向解除分配的对象发送消息可以指向任何内容。通过为TestController实例(控制器)声明属性(作为保留)来解决该问题。