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

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

【问题讨论】:

    标签: iphone objective-c ios ipad


    【解决方案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 问题以获取更多信息。
    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多