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/