0

避免在块内捕获自我的常见模式是在块外创建一个弱自我,并使用它在块内创建一个“局部强”版本的自我(内在自我)。

__weak ClassX *weakSelf = self;
[someOtherObject methodThatTakesCOmpletionBlock: ^{

             ClassX innserSelf = weakSelf; //innserSelf creation?     
             [someObject send:innerSelf.prop;}];

执行该行时会发生什么innserSelf creation?发送方法时是否是selfinnerSelf副本methodThatTakesCompletionBlock:someOtherObject

这个问题只关注执行 innserSelf 行时会发生什么。我已经看到对块内的弱引用的强引用,它是相关的,但没有解决这一点。

4

2 回答 2

3

考虑:

 __weak id weakSelf = self;
 [other doSomething: ^{
     __strong id strongSelf = weakSelf;
     ....
 }];

复制块时other,没有强引用。

执行块时other,会在块执行开始时创建强引用。当块完成时,执行范围就消失了,因此strongSelf引用被破坏了。

是否other挂在块上无关紧要;该strongSelf引用仅在块执行期间存在

于 2016-10-10T01:17:00.447 回答
0

将弱指针分配给强指针不会复制对象。两个指针都指向同一个对象。强指针保留因此将 +1 添加到保留计数。弱指针不会改变保留计数

于 2016-10-09T01:17:30.007 回答