Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在没有数千个ifs的情况下,防止块为零时崩溃_Objective C_Objective C Blocks_Categories - Fatal编程技术网

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
的测试移到了方法中,这样就不必每次都写出来了。