9

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

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

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

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

void SomeHandler( void )
{
}
4

4 回答 4

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);
于 2010-08-17T03:50:52.070 回答
8

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

[[UIApplication sharedApplication] setKeepAliveTimeout:5.0 handler:^{
    NSLog( @"This is my timeout handler" );
}];
于 2010-08-17T05:21:52.463 回答
1

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

于 2010-08-17T03:51:44.937 回答
0

功能可以被屏蔽如下。

#if NS_BLOCKS_AVAILABLE
- (void)foo;
#endif
于 2010-10-05T16:04:23.407 回答