ClassA.h的东西

typedef void (^ ValidatorBlock)(BOOL);
...
@interface ClassA : NSObject {
    ValidatorBlock validatorBlock;
}
...
- (void)setValidatorBlock:(ValidatorBlock)block;
...
@property (nonatomic, retain) ValidatorBlock validatorBlock;

ClassA-> setValidatorBlock
- (void)setValidatorBlock:(ValidatorBlock)block {
    validatorBlock = [block copy];
}

ClassA-> validateForm
- (void)validateForm {
    validatorBlock(NO);
}

ClassA-> textFieldDidEndEditing
- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self validateForm];
}

ClassB-> viewDidLoad-发生魔术的地方
void (^block)(BOOL) = ^(BOOL is_valid) {
    // works fine when passed NO, always crashes when passed YES with EXC_BAD_ACCESS
    NSLog(@"block: %@", is_valid);
};

ClassA *classA = [[ClassA alloc] init];
[classA setValidatorBlock:block];

我浏览了许多Google文章,但我使用copy的实现仍然给了我同样的问题。有任何想法吗?

**回答后的 **

@vikingosegundo在String Specifier Formats上分享了一个很棒的链接

最佳答案

BOOL不是对象。使用@"%d"代替进行日志记录

要么

void (^block)(BOOL) = ^(BOOL is_valid) {

    if (is_valid) NSLog(@"YES", nil);
    else NSLog(@"NO", nil);

};

Ternary Operator的另一种方式:
NSLog(is_valid ? @"Yes" : @"No");

关于objective-c - EXC_BAD_ACCESS在块“回调”上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7946050/

10-10 21:14