block使用步骤
- 确定block的类型
- 确定block的代码
回调block
__block 是为了把对象的地址传到 block 中,因为 block 块有可能在任何线程中执行,有可能无法找到上面的对象
应用举例
//定义在 block 之外的类
__block NSArray* result = nil;
//在全局队列中异步执行--有可能在任何非主线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//此处如果 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");
}
}