Block

一、前言

     block是iOS4.0+和Mac oxX
10.6从此引进的对C语言的展开,用来促成匿名函数的特征。所谓匿名函数,也成闭包函数,即允许成立叁个一时的远非点名名称的函数。最平日作回调函数(callback)参数的值,也有任何用法,比如作为三个变量值来利用。

② 、基础知识

   
 ① 、再iOS中,使用脱字符”^”来声称三个block变量,block的剧情包括在{}中,并且和C语言一样用“;”来代表语句的终结。具体定义如下图:

图片 1

倘诺没有参数则参数名num能够回顾。

 

     贰 、定义3个粗略的远非再次来到值,没有参数的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();
}

③ 、定义一个简约的有参数没有重临值的block,如下:

//有参数,没有再次回到值的block

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

④ 、定义3个有参数,有再次回到值得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);
}

伍 、将来分析一下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);
}

运维结果如下:

图片 2

结果是:

blockOne因为尚未动用其余外部变量,他的蕴藏区域在全局区,而blockTwo因为运用了表面变量,则存款和储蓄在堆。而四个内存地址一样,都坐落堆内部存款和储蓄器中。

另附:

   
 Block再内存中的地方分为三种档次:NSGlobalBlock、NSStackBlock、NSMallocBlock

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

               NSStackBlock:位于栈内部存款和储蓄器,函数重临后Block将对事情没有什么益处

               NSMallocBlock:位于堆内部存款和储蓄器。 

注:参考网上有些大神的写的。