假设您在对象上有三个方法:
- (void) handleBlockA:(void(^)())block;
- (void) handleBlockB:(void(^)(void))block;
- (void) handleBlockC:(dispatch_block_t)block;
现在你打电话给他们:
[self handleBlockA:^(NSString*s){}];
[self handleBlockB:^(NSString*s){}];
[self handleBlockC:^(NSString*s){}];
在一个干净的Xcode项目中,Clang将不警告您handleBlockA:
调用,但会为其他两个调用引发错误。事实上,在block()
方法(handleBlockA:
)中调用objc_storeStrong
后,第一个将很快运行并崩溃。
为什么呢? void(^)()
和void(^)(void)
之间有什么区别?
是否有编译器标志会使Clang也警告handleBlockA:
电话?