Block的一些注意事项

Block注意事项


//1.block中可以访问外面的变量

    int a = 10 ;

    void (^myBlock)()=^{

        NSLog(@"a = %i",a);


  };

    myBlock();//a = 10

//2.block中可以定义和外界同名的变量,如果定义同名变量,在block中访问的是block中的变量

    int a = 10 ;

    void (^myBlock)()=^{

        int a = 20;

        NSLog(@"a = %i",a);


  };

    myBlock();//a = 20

//3.默认情况下,不可以在block中修改外界变量的值

    //block中的变量和外界的变量并不是同一个变量

    //如果block中访问到了外界的变量,block会将外界的变量拷贝一份到堆内存中,可以打印内存地址查看

    //因为block中使用的外界变量是copy的,修改调用之前的变量的值,不会影响到block中copy的值

    int a = 10 ;

    NSLog(@"&a = %p",&a);// &a = 0x7fff5fbff84c

    void (^myBlock)()=^{

        NSLog(@"&a = %p",&a);

// &a = 0x100700710

        NSLog(@"a = %i",a);


  };

    a = 40;

    myBlock();//a = 10

//如果想在block中修改外界变量的值,必须在外界变量前加上__block

//如果在block中修改了外界变量的值,会影响到外界变量的值

   __block int a = 10 ;

    NSLog(@"a = %i",a);//10

    void (^myBlock)()=^{

        a = 40;

        NSLog(@"a = %i",a);//40


  };


  myBlock();

//为什么不加__block不能修改block中修改外界的值

//因为在编译的文件中main.cpp中a 是作为值传递

     int a = 10 ;

    void (^myBlock)()=^{

        NSLog(@"a = %i",a);


  };


  myBlock();

//为什么加了__block能修改block中修改外界的值

//如果加了__block之后就是地址传递,所以可以在block中修改外界变量的值

   __block int a = 10 ;

    void (^myBlock)()=^{

        a = 50;

        NSLog(@"a = %i",a);


  };


  myBlock();

block是存储在堆中还是栈中

默认在栈中,如果对一个block进行copy操作,block会转移到堆中

栈的存储方式是先进后出,存的时候:第一份先存到栈底,最后的一份存到栈顶,取的时候先取出栈顶的,最后取出栈底的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容