2010-08-17 47 views
9

在iPhone SDK 4.0中,UIApplication有一个新方法,setKeepAliveTimeout:需要第二个参数void(^)(void)这个caret ^语法是什么,两边都是void意味着什么?

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

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

FWIW下面是不是它的寻找......

void SomeHandler(void) 
{ 
} 

回答

23

这是一个“块”,一个新的功能,苹果增加了到C雪豹。其它更多信息,请访问:

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

块对象,

块对象(非正式的“块”)是一个延伸至C,以及Objective-C和C++,使它方便程序员定义自包含的工作单元。块与 - 传统函数指针相似,但功能要强大得多。关键的区别是:

块可以联定义,如 块捕捉只读其他语言 局部变量的副本,类似“倒闭潮”这是一种功能性的动态是常见的“匿名函数”。类型的解释型语言,但以前从未广泛提供给C程序员。 Apple已经在MIT许可证下发布了Blocks语言规范和我们的开放源码实现,并增加了对GCC 4.2和clang的块支持,并且已经提交它作为下一版本C编程语言的一部分。

语法

A嵌段可变看起来像一个函数指针,除了与一个脱字符号(“^”),而不是一个星号(“*”)。

void (^my_block)(void); 
8

而对于该特定功能的代码将看起来像这样:

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

函数可以被屏蔽如下。

#if NS_BLOCKS_AVAILABLE 
- (void)foo; 
#endif