2011-10-30 24 views
1

ClassA.h东西EXC_BAD_ACCESS上一座座 “回调”

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

我撇去了一些谷歌的文章我与copy实现仍然给了我同样的问题。有任何想法吗?

** 答案 **

@vikingosegundo共享上String Specifier Formats

+0

+1添加有用的信息,为未来的读者 – vikingosegundo

回答

5

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

[字符串格式说明](HTTP://开发商.apple.com /库/ MAC /#文档/的CoreFoundation /概念/ CFStrings/formatSpecifiers.html#// apple_ref/DOC/UID/TP40004265-SW1) – vikingosegundo