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

And*_*ant 9 syntax objective-c objective-c-blocks

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

-(BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void(^)(void))keepAliveHandler
Run Code Online (Sandbox Code Playgroud)

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

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

void SomeHandler( void )
{
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*rog 23

这是一个"块",这是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);
Run Code Online (Sandbox Code Playgroud)


zpa*_*ack 8

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

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