C语言Block

一、前言

     block是iOS4.0+和Mac oxX
10.6后引进的对C语言的拓,用来促成匿名函数的特点。所谓匿名函数,也成闭包函数,即许创建一个临时的从未有过点名名称的函数。最常发作回调函数(callback)参数的价,也时有发生另外用法,比如当一个变量值来以。

其次、基础知识

   
 1、再iOS中,使用脱字符”^”来声称一个block变量,block的始末包含在{}中,并且与C语言一样用“;”来表示语句的扫尾。具体定义如下图:

C语言 1

假定没参数则参数名num可以略。

 

     2、定义一个简单的从未有过回到值,没有参数的block,如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    //block
    void(^myBlock)(void)  = ^(void) {
        NSLog(@"This is a block without parameter and returned value");
    };
    myBlock();
}

啊得一直写成:

- (void)viewDidLoad {
    [super viewDidLoad];

    //block
    void(^myBlock)(void)  = ^ {
        NSLog(@"This is a block without parameter and returned value");
    };
    myBlock();
}

3、定义一个粗略的生参数没有返回值的block,如下:

//有参数,没有返回值的block

-(void)blockWithParameterButNoReturnData
{
    void(^myBlock)(int) = ^(int num) {
        NSLog(@"%d",num*100);
    };
    myBlock(4);
}

4、定义一个起参数,有归值得block,如下:

//有参数,有返回值的block

-(void)blockWithParameterAndReturnValue
{
    int (^myBlock)(int) = ^(int num) {
        return num * 100;
    };
   int result =  myBlock(2);
    NSLog(@"This is a block with parameter and return value :%d",result);
}

5、现在分析一下block的存储域:

运行下面函数:

-(void)testBlock
{
    void(^blockOne)(void) = ^ {
        NSLog(@"This is block one");
    };
    int c = 10;
    void(^blockTwo)(void) =^(void) {
        NSLog(@"This is a block two %d",c);
    };
    void(^blockThree)(void) =[blockTwo copy];
    NSLog(@"blockOne address is :%@",blockOne);
    NSLog(@"blockTwo address is :%@",blockTwo);
    NSLog(@"blockThree address is :%@",blockThree);
}

运转结果如下:

C语言 2

结果是:

blockOne因为从没行使任何外部变量,他的积存区域在全局区,而blockTwo因为使用了表面变量,则存储于积。而少于独内存地址一样,都在堆内存中。

另附:

   
 Block再内存中的职分为三种植类型:NSGlobalBlock、NSStackBlock、NSMallocBlock

     其中:NSGlobalBlock:类似函数,位于text段

               NSStackBlock:位于栈内存,函数返回后Block将无济于事

               NSMallocBlock:位于堆内存。 

横流:参考网上有大神的描绘的。