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

来源:互联网 发布:资料员学习软件 编辑:程序博客网 时间:2024/05/20 00:48


 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 = 0x7fff557e8ea02016-01-29 15:04:51.774 test[5320:2848849] str2 = 0x7fff557e8ea02016-01-29 15:04:51.774 test[5320:2848849] str= 12016-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 = 0x7fff5eadeea02016-01-29 15:06:21.145 test[5339:2863054] str2 = 0x7faceaf6e4082016-01-29 15:06:21.145 test[5339:2863054] str= 22016-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 = 0x7fff5eadeea02016-01-29 15:21:57.249 test[5339:2863054] str2 = 0x7faceac0ea382016-01-29 15:21:57.249 test[5339:2863054] str= 22016-01-29 15:21:57.249 test[5339:2863054] str = 0x7faceac0ea38

基本数据类型.

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

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

0 0