繁体   English   中英

单击按钮时出现iOS EXC_BAD_ACCESS错误

[英]Ios EXC_BAD_ACCESS error when clicking button

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

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

然后在同一个类(布局)中,我还声明了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(code = 2,adress = 0x9)

有什么事吗 我也担心vc1应该管理按钮单击,因此我认为最好将方法放在vc1内。 你不这样认为吗?

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

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

在代码中设置的按钮目标-

[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类中声明具有强属性的Layout类的属性。 然后创建布局类的对象,并使用它实例化属性。

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

现在,调用您的函数(将函数名称命名为-getViewFromLayoutClass),该函数将返回您的视图,如下所示:

[propertyName getViewFromLayoutClass]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM