EXC_BAD_ACCESS定制的块(EXC_BAD_ACCESS on customised bl

2019-08-03 20:57发布

我定义一个类中的块:

BXButton.h

typedef void(^ButtonClicked)(id sender, NSDictionary *userInfo);
@property (assign, nonatomic) ButtonClicked onButtonClicked;
- (void)setClickBlock:(ButtonClicked)buttonClicked;

BXButton.m

- (void)setClickBlock:(ButtonClicked)buttonClicked {
    onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
    DLog(@"internal clicked");
    if (self.onButtonClicked) {
        onButtonClicked(self, self.userInfo);
    }
}

我想在一个视图控制器这样的呼吁:

[_testButton setClickBlock:^(BXButton *sender, NSDictionary *userInfo) {
        DLog(@"userInfo %@", userInfo);
        [sender startLoading];
        [[BXAPIClient sharedPublicClient]postPath:@"/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            [sender endLoading];
            //[safeSelf stop];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            [sender endLoading];
            [self stop];
        }];
    }];

我总是得到BAD_ACCESS每当我尝试访问[自我方法]或它的块之外定义的任何变量。 有任何想法吗? 谢谢!

Answer 1:

为什么你的原因EXC_BAD_ACCESS是因为块堆在默认情况下创建的,所以如果你有引用它们assign财产,他们会简单地停止时,堆栈被撕开下来存在。

为了解决这个问题,你应该块复制到堆。 要做到这一点的方法之一是使用copy ,而不是assign定义你的属性时。

改变你的声明

@property(copy, nonatomic) ButtonClicked onButtonClicked;

和分配的块时使用的,而不是直接访问到的ivar其设定器/吸气剂

- (void)setClickBlock:(ButtonClicked)buttonClicked {
    self.onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
    DLog(@"internal clicked");
    if (self.onButtonClicked) {
        self.onButtonClicked(self, self.userInfo);
    }
}


文章来源: EXC_BAD_ACCESS on customised blocks