如果块为零而没有数千个 ifs,则防止崩溃

Preventing a crash if a block is nil without thousands of ifs

我喜欢使用积木。我经常创建自定义 类,使用块而不是委托机制与调用者通信。

但问题是这些 类 被检查污染了,以查看是否在 运行 之前声明了块。类似于:

if (self.onExit) {
  self.onExit(flag);
}

显然我不能省略 if 否则如果 _onExitnil;

代码将会崩溃

有什么我可以创建的东西,类别之类的东西,可以让我直接 运行 块而无需成千上万的 if,但会在 [= 之前​​内部检查 nil 25=]宁了吗?

像这样的宏怎么样?

#define BLOCK_SAFE_RUN(block, ...) block ? block(__VA_ARGS__) : nil

这是来自另一个答案,这里有更多详细信息:

然后我举了一个例子:进行一些重构可能是解决问题的方法。将 null-check-and-call 放入一个方法中。然后在任何有条件调用 Block 的地方无条件调用该方法。

像这样:

@interface MyClass : NSObject
@property (copy, nonatomic) void (^onExit)(BOOL);
@end

@interface MyClass ()
- (void)performExit:(BOOL)flag;
@end

@implementation MyClass

- (void)performExit:(BOOL)flag
{
    if( self.onExit ){
        self.onExit(flag);
    }
}

- (void)doThatThing
{
    // Replace
    // if( self.onExit ){
    //     self.onExit(flag);
    // }
    // with
    [self performExit:YES];
    // everywhere.
}

@end