块“回调”上的EXC_BAD_ACCESS

时间:2011-10-30 16:02:58

标签: objective-c ios cocoa-touch

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 - magic 发生的地方

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

上分享了一个很棒的链接

1 个答案:

答案 0 :(得分:4)

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");