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);
}

 

posted @ 2015-04-13 00:05  Dalink  阅读(160)  评论(0编辑  收藏  举报