关键字__weak
和__block
1. 都属于变量修饰符, 用于修饰变量(variable). 2. __weak 和 __block 的使用场景几乎与 block 息息相关. 而所谓 block, 就是 Objective-C 对于闭包的实现. 闭包就是没有名字的函数, 或者理解为指向函数的指针.
__weak
关键字
- 主要用于防止 block 造成循环引用, 特别是 block 对 self 的引用.
__weak typeof(self) weakSelf = self;
- 代表
弱引用
. - 只能在 ARC 模式下使用, 只能修饰对象类型, 不能修饰基本数据类型.
__block
关键字
-
主要用于在 block 内部, 修改外部变量的值 & 对外部变量进行重新赋值.
block可以访问外部变量(局部变量)(实际上访问的不是同一个变量), 但是不能修改. 如果想要在`block`内部修改外部变量, 需要使用`__block`修饰外部变量, 所以说:`__block`的功能是让`block`能够修改外部变量的值.
block
对外部变量的处理- 如果block内部存在外部变量的引用, block 默认是将其复制到其数据结构中来实现访问的.
- 如果外部变量有
__block
修饰, block 对其访问是通过复制其引用地址来实现的.
-
__block
对象在block
中不会被block
强引用一次, 所以不会造成循环引用. __block
不管是 ARC 还是 MRC 模式下都可以使用, 可以修饰对象, 还可以修饰基本数据类型。
Others
- 在一篇博客中, 看到了下面这样一句话, 但我感觉不准确.
_____block对象可以在block中被重新赋值,_____weak不可以。
- 在一篇大神的博客中, 看到了这样一句话, 到现在还是一脸懵逼, 感觉没什么逻辑性可言(吐槽一下, 哈哈).
- 如果想要深入了解
block 对外部变量的处理
的细节, 可以自己写一个简单的demo, 然后通过clang进行手动编译, 处理细节一览无余. 这里推荐一篇写的不错的博客:你真的理解__block修饰符的原理么?
显示代码的插件有明显的延迟, 等好长时间, 代码才能正常显示…
受益匪浅, 😆~~~
厉害了