block的使用(三)
block的使用(三)
我爱觉觉 发表于2年前
block的使用(三)
  • 发表于 2年前
  • 阅读 5
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: block访问外部变量

// 栈区,堆区,BSS,数据区,代码区


#import <Foundation/Foundation.h>


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

    @autoreleasepool {

        

        // 第一种和第二种

        //int i = 10; // 栈区

        

        // 第三种 __block修饰符告诉编译器,i的值可以在block内部修改(忽略检查)

        // 注意:一旦使用__block修饰之后,以后使用的都是堆区的变量。

        __block int i = 10;

        

        NSLog(@"i = %d, i addr = %p", i,&i); // i = 10, i addr = 0x7fff5fbff77c

        

        // 定义一个无参无返回值的block

        // 注意在block代码块的内部使用外部变量,

        // 1)block定义的时候,把block外部的变量的值copy到了内存的堆区

        // 2)拷贝的过程中使用了const(以const的形式把外部变量做了一个copy

        void (^myblock)() = ^{

            

            // 第一种

            // i = 100; 会报错

            // block 代码块

            // 1)能否使用变量i

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

            // 2)变量i存储在哪个内存区域

            //NSLog(@"i addr = %p",&i); // addr = 0x100102750 堆区

            

            // 第二种

            //int i = 100; // 这是定义一个局部变量 栈区

            //NSLog(@"i = %d", i); // i = 100

            //NSLog(@"i addr = %p",&i); // addr = 0x7fff5fbff72c

            

            // 第三种 一定要修改i

            i = 100;

            NSLog(@"i = %d, i addr = %p", i,&i); //i = 100, i addr = 0x1004004b8

            

        };

        myblock();

        

        i = 20;

        NSLog(@"i = %d, i addr = %p", i,&i); //i = 20, i addr = 0x7fff5fbff77c

                                             // i = 20, i addr = 0x1004004b8 第三种


        

    }

    return 0;

}


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 49
码字总数 10640
×
我爱觉觉
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: