Block得简单使用

#import <Foundation/Foundation.h>

// 定义一个叫做MyBlock的类型
// 利用MyBlock类型可以定义block变量
// 利用MyBlock类型定义出来的变量, 存储的代码必须返回int, 必须接受2个int类型的参数
typedef int (^myBlock)(int ,int);



void test()
{
    
    // 定义一个block计算两个整数的和
    int (^sumBlock)(int, int) = ^(int num1, int num2) {
        return num1 + num2;
    };
    
//  int -返回值 - (int,int) 形参
    int (^myBlock1)(int,int) = ^(int num1,int num2)
    {
        NSLog(@"num + num --- %d",num1 + num2);
        
        return num1 + num2;
    };
    
    NSLog(@"slssl -- %d", myBlock1(10,20));
    
}

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
//     myBlock 类型 v1变量名
        myBlock v1  = ^(int n1, int n2)
        {
            return n1 + n2;
        };
        
        NSLog(@"n1 + n2 === %d",v1(10,1));
        
    }
    return 0;
}

 

一个Block的内部时可以引用自身作用域外的变量的,包括static变量,extern变量或自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。在引入block的同时,还引入了一种特殊的__block关键字变量存储修饰符。 
代码块本质上与变量一样,都在函数中声明然后使用,只不过一个变量中存储一个值,一个代码块存储一个函数体(一段代码);
代码块的定义:有返回值,有参数,有变量名;
__block关键字 修饰局部变量,使局部变量变得特殊,可以在block代码块中使用:
把全局变量和局部变量作为参数传递到一个函数中,这个变量会copy一份传入到函数,函数中做的操作不会影响变量的值(根本就是两个东西)。
把全局变量和局部变量作为参数传递到一个代码块中,局部变量必须要__block来修饰,用来告诉编译器这个局部变量有些特殊可以在代码中使用,这些变量在代码块中使用就是本来的变量。 

 

posted @ 2015-04-13 17:00  hshd123  阅读(227)  评论(0编辑  收藏  举报