如果块为零而没有数千个 ifs,则防止崩溃
Preventing a crash if a block is nil without thousands of ifs
我喜欢使用积木。我经常创建自定义 类,使用块而不是委托机制与调用者通信。
但问题是这些 类 被检查污染了,以查看是否在 运行 之前声明了块。类似于:
if (self.onExit) {
self.onExit(flag);
}
显然我不能省略 if
否则如果 _onExit
是 nil
;
代码将会崩溃
有什么我可以创建的东西,类别之类的东西,可以让我直接 运行 块而无需成千上万的 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
我喜欢使用积木。我经常创建自定义 类,使用块而不是委托机制与调用者通信。
但问题是这些 类 被检查污染了,以查看是否在 运行 之前声明了块。类似于:
if (self.onExit) {
self.onExit(flag);
}
显然我不能省略 if
否则如果 _onExit
是 nil
;
有什么我可以创建的东西,类别之类的东西,可以让我直接 运行 块而无需成千上万的 if
,但会在 [= 之前内部检查 nil 25=]宁了吗?
像这样的宏怎么样?
#define BLOCK_SAFE_RUN(block, ...) block ? block(__VA_ARGS__) : nil
这是来自另一个答案,这里有更多详细信息:
像这样:
@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