[IOS 开发] __block的用途和实现原理


 test 1:

 NSString *str = @"1";
    
    NSLog(@"str1 = %p",&str);
    
    void (^printBlock)() = ^(){
        
        NSLog(@"str= %@",str);
        
        NSLog(@"str = %p",&str);
        
    };
    
    str = @"2";
    
    NSLog(@"str2 = %p",&str);
    
    printBlock();

打印结果:

2016-01-29 15:04:51.774 test[5320:2848849] str1 = 0x7fff557e8ea0
2016-01-29 15:04:51.774 test[5320:2848849] str2 = 0x7fff557e8ea0
2016-01-29 15:04:51.774 test[5320:2848849] str= 1
2016-01-29 15:04:51.774 test[5320:2848849] str = 0x7fb0faf39340

test2:

    __block NSString *str = @"1";
    
    NSLog(@"str1 = %p",&str);
    
    void (^printBlock)() = ^(){
        
        NSLog(@"str= %@",str);
        
        NSLog(@"str = %p",&str);
        
    };
    
    str = @"2";
    
    NSLog(@"str2 = %p",&str);
    
    printBlock();

打印结果:

2016-01-29 15:06:21.144 test[5339:2863054] str1 = 0x7fff5eadeea0
2016-01-29 15:06:21.145 test[5339:2863054] str2 = 0x7faceaf6e408
2016-01-29 15:06:21.145 test[5339:2863054] str= 2
2016-01-29 15:06:21.145 test[5339:2863054] str = 0x7faceaf6e408

经过测试

1.闭包里的数据是copy的指针.指针指向的是数据对象. 

   (两个str都指向同一个对象@"1",改变闭包里的str不会影响外部的str);

 2.加上__block闭包里的数据是copy的指针的指针,也就是str的指针.

    (闭包里的str存的是外部str的指针,也是就同一个对象).



test3:

    __block int number = 1;
    
    NSLog(@"str1 = %p",&number);
    
    void (^printBlock)() = ^(){

        NSLog(@"str= %d",number);

        NSLog(@"str = %p",&number);
    };
    
    number = 2;
    
    NSLog(@"str2 = %p",&number);
    
    printBlock();

打印结果:

2016-01-29 15:21:57.249 test[5339:2863054] str1 = 0x7fff5eadeea0
2016-01-29 15:21:57.249 test[5339:2863054] str2 = 0x7faceac0ea38
2016-01-29 15:21:57.249 test[5339:2863054] str= 2
2016-01-29 15:21:57.249 test[5339:2863054] str = 0x7faceac0ea38

基本数据类型.

基本数据类型不存在指针的指针,这个怎么解释

查看官方的文档解释,copy闭包的数据都会复制到堆中.堆中的数据是有指针的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值