如果一个块为nil而没有数千个if,则防止崩溃



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

但是问题是这些类被检查污染了,检查在运行它们之前是否声明了块。比如:

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

显然,我不能省略if,否则如果_onExitnil,代码将崩溃;

我是否可以创建一些东西,一个类别或其他东西,这将允许我直接运行块,而不需要数千个if s,但在运行之前会内部检查是否为nil ?

这样的宏呢?

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

这是来自另一个更详细的答案:https://stackoverflow.com/a/13037198/747339

rmaddy在评论中建议了这一点,我随后给出了一个例子:在这里进行一点重构可能是可行的。将空检查和调用放入方法中。然后在有条件调用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

最新更新