1

我以前从未见过这种响应,在同一应用程序的不同运行中,相同的操作会引发不同的错误。

我在 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。

此测试应用程序中唯一的代码是应用程序委托中用于实例化视图控制器的代码:

- (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 错误。

4

1 回答 1

0

好的,我用来自 MacScripter 的 Shane Stanley 的指针解决了这个问题(我在 ApplescriptObjC 中制作了另一个版本来问那里的问题,但那个版本有效)。这是内存管理的问题——在使用 ARC 时很容易忘记这一点。在我向它发送 IBAction 之前,TestController 实例被释放了。这解释了可变错误消息,因为向已释放对象发送消息可以指向任何内容。通过为 TestController 实例控制器声明一个属性(作为保留)解决了该问题。

于 2012-06-03T02:57:35.997 回答