可以将 NULL 传递给块参数吗?

Posted

技术标签:

【中文标题】可以将 NULL 传递给块参数吗?【英文标题】:Is it okay to pass in NULL to a block parameter? 【发布时间】:2011-12-19 23:50:38 【问题描述】:

当我将NULLnil 传递到animateWithDuration:animations:completion: 的完成块时,ios 不会对我大喊大叫,但这是否意味着没关系?还是开个空的^ 比较好?

【问题讨论】:

【参考方案1】:

只要您可以相信您传递nil 的代码不会尝试将其作为块调用,就可以了。

快速演示:

typedef void (^GenericBlock)(void);

void useThisBlock(GenericBlock block)
    block();


useThisBlock(^NSLog(@"All okay."););
useThisBlock(nil);    // Compiles but crashes

内码必须先检查区块:if( block ) block();

如果是 UIKit 代码,应该没问题。

【讨论】:

"如果是 UIKit 代码,应该没问题。" 需要引用吗? @Manav:你没看错——没有办法验证(除非它不会崩溃)。【参考方案2】:

传递nil 很好,在我看来会产生更清晰的代码。

如果您不想使用完成块,对于这种情况,您也可以使用[UIView animateWithDuration:animations:] 方法。

【讨论】:

谢谢,我知道有没有动画块的方法。我的问题更多是关于块本身。那么为什么是nil,而不是NULL nilNULL 是等价的。按照惯例,Objective-C 通常使用 nil,而 C 中使用 NULL 这在 ARC 中并不完全正确。 nil 表示对象,必须在需要id 的地方使用,而NULL 表示非对象无效指针,必须在需要(void *) 的地方使用。请查看this 问题以获取更多信息。

以上是关于可以将 NULL 传递给块参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 8将当前nid传递给块模板

问: js要传string型参数,可以直接将变量用toString()方法转换吗?

Laravel 可以在 column = 之间自动切换吗?和列是 NULL 取决于值?

你如何将参数传递给define_method?

您可以将 mysql 列别名传递给用户定义的函数吗

可以将 OrderedDict 作为 Celery 任务参数传递吗?