我喜欢用积木。我不断地创建自定义类,使用块来与调用者通信,而不是委托机制。
但是问题是这些类被检查污染了,检查在运行它们之前是否声明了块。比如:
if (self.onExit) {
self.onExit(flag);
}
显然,我不能省略if
,否则如果_onExit
是nil
,代码将崩溃;
我是否可以创建一些东西,一个类别或其他东西,这将允许我直接运行块,而不需要数千个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