2011-10-30 29 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