Objective-C的block特性(1)
引用请注明出处:http://www.cnblogs.com/idalink/articles/4421078.html
Objective-C的block关键字定义了一个代码块,用以语言级别的闭包。block代码块用起来十分像C语言的函数,而block变量自然而然就是函数指针变量。block代码块也可以像函数指针一样,自由传递。但是block却与C语言函数有着重要区别,首先C语言函数一旦编译,就固定下来,二进制指令不会在内存中“游荡”,也不会被销毁,block代码块像对象一样(其实就是对象),可以在堆、栈上“游走”,block对象也有生命周期。其次,c语言函数不会捕获外围变量,内部变量必须由参数传入或自己构建,但是block块却能捕获外围变量。这些特点足够说明了block与函数的区别。
既然block能够捕获外围变量,那就不得不引出一个老生常谈的问题,自己的生命周期与被捕获变量的生命周期,这一点,下一章再谈论。这一章,现在仅仅讨论时block的语法特性。
block既然看起来与函数如此想象,那就先回顾一下C语言函数指针与函数变量。
先看看block的语法格式。
1、声明block变量,并直接调用。(注意,没有返回值哟!)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //带参数 ^(NSString *name){ NSLog(@"Hello %@, I am block.", name); }(@"Dalink"); //不带参数,可以省略void ^(void){ NSLog(@"Hello, I am block."); }(); //不带参数,可以省略括号 ^{ NSLog(@"Hello, I am block."); }(); }
2、定义block类型。(注意,定义类型需要写明返回值。)
上一小节中定义完毕block变量后直接调用。那怎么才能把这个变量传递出去呢?自然就需要定义block变量类型:
- (void)viewDidLoad { [super viewDidLoad]; //定义一个变量 NSString * (^myBlock)(NSString *) = ^(NSString *name){ NSLog(@"Hello %@, I am block.", name); return name; }; //调用block NSString * result = myBlock(@"liuyu"); NSLog(@"result--->%@", result); //如果没有参数可省略^后面的() void (^dosthBlock)() = ^{ NSLog(@"do something."); }; dosthBlock(); }
3、通过typedef定义block类型
- (void)viewDidLoad { [super viewDidLoad]; typedef NSString * (^MyBlock)(NSString *); MyBlock myBlock = ^(NSString *name){ NSLog(@"Hello %@, I am block.", name); return name; }; //调用block NSString * result = myBlock(@"liuyu"); NSLog(@"result--->%@", result); }