Objective c 在没有数千个ifs的情况下,防止块为零时崩溃
我喜欢用积木。我不断创建自定义类,这些类使用块与调用方通信,而不是委托机制 但问题是,这些类在运行之前被检查块是否已声明而受到污染。比如:Objective c 在没有数千个ifs的情况下,防止块为零时崩溃,objective-c,objective-c-blocks,categories,Objective C,Objective C Blocks,Categories,我喜欢用积木。我不断创建自定义类,这些类使用块与调用方通信,而不是委托机制 但问题是,这些类在运行之前被检查块是否已声明而受到污染。比如: if (self.onExit) { self.onExit(flag); } 显然,如果\u onExit为nil,我不能忽略,否则代码将崩溃 有什么我可以创建的,一个类别或什么,可以让我直接运行块而不需要数千个ifs,但在运行之前会在内部检查nil吗?这样的宏呢 #定义块\安全运行(块,…)块?块(_VA_ARGS):nil 这是另一个答案,这里有
if (self.onExit) {
self.onExit(flag);
}
显然,如果\u onExit
为nil
,我不能忽略,否则代码将崩溃
有什么我可以创建的,一个类别或什么,可以让我直接运行块而不需要数千个if
s,但在运行之前会在内部检查nil吗?这样的宏呢
#定义块\安全运行(块,…)块?块(_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
也许你应该考虑迁移到Swift并使用一个更短的<>代码> 展开:)切换到Swift。在Swift中,块被称为闭包,可以为nil的闭包被封装在可选函数中。您可以解析带有问号的可选项。所以你会说self.onExit?()
。问号的意思是“检查关闭,看看它是否为零。如果是,请停止。如果不是nil,则调用它。不幸的是,我无法将此代码迁移到swift,因为这是其他人的项目。为什么这一属性有数千个If
s?为什么不将它们的用法包装在助手方法中?然后使用helper方法,如果
(在helper方法内部),则只有一个。@JoshCaswell。很好。那么如何使用它呢?只要在当前测试和调用块的任何位置调用performExit:
。抱歉,我不知道如何按照我要求的方式运行块。该方法是为您调用块。我刚刚将nil
的测试移到了方法中,这样就不必每次都写出来了。