2010-08-17 91 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