【问题标题】:What does this caret ^ syntax, with void on either side mean? [duplicate]这个插入符号 ^ 语法,两边都有 void 是什么意思? [复制]
【发布时间】:2010-08-17 03:47:28
【问题描述】:

在 iPhone SDK 4.0 中,UIApplication 有一个新方法 setKeepAliveTimeout:,它需要 void(^)(void) 类型的第二个参数。

-(BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void(^)(void))keepAliveHandler

第二个参数的语法究竟是什么意思,我将如何声明一个可以传递给它的函数/处理程序?

FWIW 以下不是它正在寻找的...

void SomeHandler( void )
{
}

【问题讨论】:

    标签: objective-c syntax objective-c-blocks


    【解决方案1】:

    它是一个“块”,是 Apple 在 Snow Leopard 中添加到 C 中的新功能。更多信息请访问:

    https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

    块对象

    块对象(非正式地,“块”)是对 C 以及 Objective-C 和 C++ 的扩展,使程序员可以轻松定义自包含的工作单元。块类似于——但比传统的函数指针更强大。主要区别在于:

    块可以内联定义为“匿名函数”。 块捕获局部变量的只读副本,类似于其他语言中的“闭包” 这种功能在动态类型解释语言中很常见,但以前从未被 C 程序员广泛使用。 Apple 已在 MIT 许可下将 Blocks Languages Specification 和我们的实现作为开源发布,增加了对 GCC 4.2 和 clang 的块支持,并将其作为 C 编程语言下一版本的一部分提交以供考虑。

    语法

    块变量看起来像一个函数指针,除了用插入符号('^')而不是星号('*')。

    void (^my_block)(void);
    

    【讨论】:

      【解决方案2】:

      该特定功能的代码如下所示:

      [[UIApplication sharedApplication] setKeepAliveTimeout:5.0 handler:^{
          NSLog( @"This is my timeout handler" );
      }];
      

      【讨论】:

        【解决方案3】:

        这意味着它需要一个块(代码,又名闭包)见http://developer.apple.com/mac/articles/cocoa/introblocksgcd.html 这些是 OSX 10.6 和 iOS 4 的 Objective-c 的新功能

        【讨论】:

          【解决方案4】:

          函数可以被屏蔽如下。

          #if NS_BLOCKS_AVAILABLE
          - (void)foo;
          #endif
          

          【讨论】:

            猜你喜欢
            • 2012-11-03
            • 2016-10-10
            • 2011-10-27
            • 1970-01-01
            • 2010-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-21
            相关资源
            最近更新 更多