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闭包的数据都会复制到堆中.堆中的数据是有指针的.