什么是caret ^语法,两边都是void?

时间:2010-08-17 03:47:28

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

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

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

第二个参数的语法到底意味着什么,以及如何声明我可以传递给它的函数/处理程序?

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

void SomeHandler( void )
{
}

4 个答案:

答案 0 :(得分:23)

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

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);

答案 1 :(得分:8)

该特定函数的代码如下所示:

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

答案 2 :(得分:1)

这意味着需要一个块(代码,也就是封闭),请参阅http://developer.apple.com/mac/articles/cocoa/introblocksgcd.html 对于OSX 10.6和iOS 4来说,这些是Objective-c的新功能

答案 3 :(得分:0)

可以按如下方式屏蔽功能。

#if NS_BLOCKS_AVAILABLE
- (void)foo;
#endif