block使用步驟
- 确定block的類型
- 确定block的代碼
- 回調block
- __block 是為了把對象的位址傳到 block 中,因為 block 塊有可能在任何線程中執行,有可能無法找到上面的對象
應用舉例
//定義在 block 之外的類
__block NSArray* result = nil;
//在全局隊列中異步執行--有可能在任何非主線程
dispatch_async(dispatch_get_global_queue(, ), ^{
//此處如果 result 定義時未用__block 修飾,則會報錯,因為如果目前 block 有可能在其他線程執行
//是無法看到該對象的
result = [NSArray array];
});
- block作為參數的時候,不需要寫 block 的變量名
- 例如: -(void)testBlock: ( void ( ^ ) ( ) ) myBlock
- 事例代碼
- (void)test
{
//定義要傳入的 block
void (^myblock)(NSString*) = ^(NSString* str) {
NSLog(@"傳入的字元串是:%@", str);
};
[self testBlockWithBlock:myblock];
}
- (void)testBlockWithBlock:(void (^)(NSString* string))block
{
//調用傳入的 block
if (block) {
block(@"hello world");
}
}