繁体   English   中英

在nil对象上调用块可提供exc_bad_access

[英]Calling block on a nil object gives exc_bad_access

我遇到了这种情况,当我在nil对象上调用一个块时,我的应用程序因exec_bad_access而崩溃。 我可以通过添加if条件来解决此问题,但我想知道为什么在nil对象上调用block会导致bad_access?

@interface CustomView :UIView

@property (nonatomic, strong) UIImage* sourceImage;
@property (nonatomic, copy) void(^doneSwipingBlock)();

- (void)testMethod;

@end

//Another Class
//Sample Code (this is not the actual code but shows the crash 
CustomView view = nil;
view.sourceImage = [UIImage imageNamed:@"image.png"]; //no error as view is nil
[view testMethod]; //no error as view is nil
view.doneSwipingBlock();  //Crashes here

/*
//This works fine
if (view.doneSwipingBlock) {
    view.doneSwipingBlock();
}
*/

因为虽然块是对象,所以不应将对块的操作视为尊重Objective-C语义。 就像从NULL读取会导致错误的访问一样,调用NULL块也会导致错误的访问。 这与函数指针的行为一致(调用NULL函数指针会使您的程序崩溃),并且由于C和C ++中都提供了块,因此使用此行为比纯粹的Objective-C行为更有意义。

不会通过objc_msgSend调用invoke方法,该方法处理并取消对Objective-C对象上的nil对象的调用。

块是变量,不是方法。 您可以从block属性中获得与从int属性中获得的相同的期望。 它们就像您有一个名为Block类,上面有一个invoke方法,您每次需要它做一些不同的事情时都将它子类化,只是编译器会完成所有子类化部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM