单击按钮时出现Ios EXC_BAD_ACCESS错误

时间:2014-09-16 20:23:03

标签: ios objective-c uibutton target-action

我有一个视图控制器(vc1),它使用另一个类来获取UI元素。 因此vc1的视图设置为子视图,从名为Layout的类返回另一个视图。 从类Layout返回的视图包含一个UI按钮。 在Layout类中,我有以下代码:

[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside];

然后在同一个类(Layout)中我也声明了方法button_clicked:

- (void)button_clicked:(id)sender {
    NSLog(@"btn clickd");
}

但是,当我点击按钮时会发生错误。我在调试区域看不到任何错误消息,但Xcode的状态看起来不太好。模拟器失去焦点,Xcode出现了一个文件(我猜它的AppDelegate.m)与这一行:

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}

以绿色突出显示。 另外,在代码中我看到了消息:

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x9)

可能有什么不对?我也担心vc1应该管理按钮点击,所以我认为最好放在vc1中的方法。你不这么认为吗?

2 个答案:

答案 0 :(得分:1)

您的说明建议您在按下按钮之前释放设置为按钮目标的Layout实例,因此,当您按下按钮时,使用无效指针。

检查保留您正在使用的Layout实例的内容,并确保将其保留(至少保留为按钮操作目标的时间)。

答案 1 :(得分:0)

代码中设置的按钮目标 -

[btn addTarget:self action:@selector(button_clicked:)   forControlEvents:UIControlEventTouchUpInside];
在您点击按钮之前,

可能会被释放。

如果要在按钮上放置要调用的方法,请在视图控制器(vc1)内单击,您可以这样做。只需将按钮的目标从self更改为nil。

[btn addTarget:nil action:@selector(button_clicked:)   forControlEvents:UIControlEventTouchUpInside];

然后在vc1中实现“button_clicked”方法。您的布局类中可能会警告“button_clicked”是未声明的选择器,您可以忽略它。

如果要在“布局”类中调用“button_clicked”方法,则可以执行此操作。在vc1类中声明具有strong属性的Layout类的属性。然后创建布局类的对象并使用它实例化该属性。

Layout *propertyName = [[Layout alloc] init];

现在,调用你的函数(让函数名为 - getViewFromLayoutClass),它返回你的视图如下 -

[propertyName getViewFromLayoutClass]

现在,当您单击按钮时,它应该调用Layout类中的方法。