ios之block

Block基本概念

Block是OC中的一种数据类型
是一个能工作的代码单元,可以在任何需要的时候被执行
本质上是轻量级的匿名函数,可以作为其他函数的参数或者返回值
块代码本身可能有一个参数列表,也可能有一个返回值
可以把块代码赋给一个变量,并在需要的时候调用,就像调用一个普通函数一样

块代码使用的注意事项
默认情况下,不允许在块代码内部修改外部变量的数值
__block
循环引用 __weak

格式说明:
(返回类型)(^块名称)(参数类型列表) = ^(形参列表) {代码实现};
void (^myBlock)(int,int) = ^(int x , int y) 
{
      //代码实现        
}

//下面是Block的简单使用

#import <Foundation/Foundation.h>

typedef double(^MyBlock)(double, double);
MyBlock area = ^(double x, double y) {
    return x * y;
};


int a = 0;

static int b = 11;

/** block的定义*/
void test1()
{
    // block 定义,是准备好一段代码片段,在需要的时候执行
    // block是C语言的格式
    // 输入:inlineblock
    // 格式:返回类型 (^blockName) (参数类型) = ^(形参列表) { 代码实现 };
    // 提示:如果没有参数,格式可以简化
    // 格式:返回类型 (^blockName) () = ^ { 代码实现 };
    void (^myBlock)() = ^{
        NSLog(@"block的最简单定义");
    };
    //调用myblock
    myBlock();
    
    //最全的定义
    int (^block) (int , int , int) = ^(int x, int y, int z)
    {
        return x + y + z;
    };
    
    int sum = 0;
    sum = block(10,19,20);
    
    NSLog(@"sum - %d",sum);
    
}


/** 外部访问变量,常见面试题1*/
void test2()
{
    int x = 10;
    __block int y = 20;
    NSLog(@"x - %d , x - add - %p",x,&x);
    
    // 在定义block时,如果block中使用到外部的“局部”变量,block会建立该变量的副本(会记录当前x的数值)
    void (^block)() = ^{
/**********在使用局部变量时,默认不允许在块代码中直接修改局部变量的数值********/
//        x = 20;
        
        /************全局变量可以在block中修改其值******************/
        a = 10;
        /**********如果要在block中修改外部变量的值,需要使用 __block***************/
        y = 30;
        NSLog(@"block - x = %d",x);
        NSLog(@"block - x = %p",&x); //默认存储是再栈中
    };
    block();
    NSLog(@"最后的x = %d",x);
    
}

/** 外部访问变量,常见面试题2*/
void test3()
{
    NSMutableString *str = [NSMutableString stringWithFormat:@"hello"];
    NSLog(@"定义之前 - %p 定义之前 - %p", &str, str);
    void (^block)() = ^{
     // 修改指针指向内存空间的内容
        [str setString:@"水水水水"];
        NSLog(@"block里面通过指针 - %p %@", &str, str);
        
    };
    
    block();

}

int main(int argc, const char * argv[])
{

    
    
    
    test3();
    return 0;
}

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。