避免在Block中捕获self的常见模式是在Block之外创建一个弱自我,并使用它来创建一个"本地强大的" Block中的self版本(内部自我)。
__weak ClassX *weakSelf = self;
[someOtherObject methodThatTakesCOmpletionBlock: ^{
ClassX innserSelf = weakSelf; //innserSelf creation?
[someObject send:innerSelf.prop;}];
innserSelf creation
行执行后会发生什么?方法innerSelf
发送到methodThatTakesCompletionBlock:
时,someOtherObject
是副本吗?
这个问题只关注执行innserSelf线时会发生什么。我看过Strong reference to a weak references inside blocks这是相关的,但没有解决这一问题。
答案 0 :(得分:2)
考虑:
other
当other
复制块时,没有强引用。
当strongSelf
执行块时,则在块执行开始时创建强引用。块完成后,执行范围消失,因此other
引用被破坏。
strongSelf
是否挂在街区上是无关紧要的; {{1}}引用仅在块执行期间存在。
答案 1 :(得分:0)
将弱指针指定给强指针不会复制该对象。两个指针都指向同一个对象。强指针保留,因此为保留计数增加+1。弱指针不会改变保留计数