Jacksonkr
Jacksonkr

Reputation: 32207

EXC_BAD_ACCESS on a Block "callback"

ClassA.h stuff

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 - where the magic happens

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];

I skimmed a number of google articles and my implementations with copy still gave me the same issue. Any ideas?

** after answer **

@vikingosegundo shared a great link on String Specifier Formats

Upvotes: 1

Views: 422

Answers (1)

vikingosegundo
vikingosegundo

Reputation: 52227

BOOL is not an object. use @"%d" instead for logging

or

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

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

};

yet another way with Ternary Operator:

NSLog(is_valid ? @"Yes" : @"No");

Upvotes: 4

Related Questions