[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
- [IOS 开发] __block的用途和实现原理
- iOS中__block 关键字的底层实现原理
- iOS中__block 关键字的底层实现原理
- iOS开发63-__block 和 __weak的区别
- iOS __block和__weak的区别
- 深入研究Block捕获外部变量和__block实现原理
- 深入研究Block捕获外部变量和__block实现原理
- 深入研究Block捕获外部变量和__block实现原理
- iOS开发之 __block 与 __weak的区别理解
- 索引的原理和用途
- iOS开发 ☞ __block,__weak,__strong
- __block和__weak的区别
- __block和__weak 的区别
- __weak和__block的区别
- __Block和__Weak的区别
- __block和__weak的区别
- __block和__weak的区别
- iOS __block
- 构建高性能web
- 微信开发注意事项(我会持续更新的)
- 附加/分离存储的源代码分析
- java websocket
- fix导航条然后然滚动条隐藏
- [IOS 开发] __block的用途和实现原理
- linq中的contains条件(可循环)
- strange problems while you are using Intellij IDEA
- Treap树学习小结
- ARM内核和架构的关系(超形象)
- SpringMVC关于MyBatis通用公共Dao的实现
- hdu 1016 Prime Ring Problem
- oracle合理的使用索引原则
- CI中使用redis