使用 block 时的 iPhone EXC_BAD_ACCESS

标签 iphone objective-c cocoa-touch

我正在尝试使用 block 创建一个简单的回调。 我有一个 MainViewController addSubView 另一个 DatePickerViewController.view 我创建了一个这样的 block

typedef void(^DateChangedBlock)(NSDate*);

我的 DatePickerViewController 上有一个方法叫做

setOnDateChangedCallback:(DateChangedBlock)callback

我将回调存储在 DatePickerViewController 的属性中。 DatePickerViewController 的 View 是一个 UIDatePicker 实例,我已将 IBAction 绑定(bind)到更改为执行此操作的方法的值。

- (IBAction)dateChanged:(id)sender {

    if (dateChangedCallback != nil)
    {
        dateChangedCallback(nil);
    }
}

这是我在 MainViewController 中注册 block 的方式

DatePickerViewController *dateController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerView" bundle:nil];

self.datePicker = dateController;
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
[self.view addSubview:textView];
DateChangedBlock myBlock = ^(NSDate *newDate) {
 textView.text = @"testing";
};

[self.datePicker setOnDateChanged: myBlock];
[self.datePicker dateChanged:self]; // force trigger (this works).

当我强制触发 DatePickerViewController 上的 dateChanged 方法时,它没有问题。但是当日期选择器本身通过 IBAction 触发方法时,我得到一个 EXC_BAD_ACCESS 错误。此方法中的错误发生在“int retVal”行。

#import <UIKit/UIKit.h>

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil); // THREAD 1: program received EXC_BAD_ACCCESS.**
    [pool release];
    return retVal;
}

我做错了什么?

最佳答案

将 block 传递给其他方法(例如您的情况下的属性 setter )时,您应该复制 block 。因此,在设置回调 block 时,请执行以下操作:

[self.datePicker setOnDateChanged:[[myBlock copy] autorelease]];

您得到 EXC_BAD_ACCESS,因为创建 block 时使用的 block 变量不会被 block 本身保留。所以当调用 block 时 - 变量不再存在。

关于使用 block 时的 iPhone EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5289306/

相关文章:

objective-c - 在 NSString 中搜索网页链接

ios - 是否可以仅针对 4 英寸 iPhone 显示屏进行构建?

ios - getControlPointAtIndex 参数类型

ios - 将 NSNumber 转换为 Boolean 会为 iPhone 和 iPad 提供不同的结果

ios - TouchId 身份验证 - 删除警报

objective-c - 对 NSSet 中所有对象的属性求和的快速方法?

ios - 从一个 ViewController 导航到另一个 ios 后如何保持复选框状态

ios - popToViewController 首先执行

ios - 如何获得比 1Hz 更快的 CoreLocation 刷新率?

ios - animateWithDuration 无法识别?