为什么弱强舞蹈能够保持循环?

时间:2018-04-03 07:37:22

标签: ios objective-c

这是我的代码:

NSLog(@"%p",self);

__weak typeof(self) weakSelf = self;
NSLog(@"%p", weakSelf);

[self setBlk:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    NSLog(@"%p", strongSelf);

    strongSelf.str = @"foo";
}];

self.blk();

blkstr属性。

我得到了这样的日志:

2018-04-03 14:51:57.151946+0800 Block[20267:148833] 0x7fafa1506d90
2018-04-03 14:51:57.152177+0800 Block[20267:148833] 0x7fafa1506d90
2018-04-03 14:51:57.152359+0800 Block[20267:148833] 0x7fafa1506d90

结论是selfweakSelfstrongSelf指向同一个对象,它们的不同只是强弱。在我看来,selfstrongSelf是完全相同的。所以我认为这段代码的记忆是这样的:

我的困惑是当块被执行时,block会强烈引用self,但如果self在同一时间没有被释放,self也会强引用块。它会导致保留周期吗?

1 个答案:

答案 0 :(得分:2)

在我看来,它不会导致保留周期。我认为你误解了一些观点。

  • Block不会保留self的强引用,它会保留一个弱引用。
  • selfstrongSelf不相同。
  • strongSelfweakSelf而非self 的强引用,因此不会导致保留周期。
  • 如果在执行阻止时未释放self,则strongSelf将成为self的强引用。但是strongSelf是一个局部变量,只有在完全执行块之后才能释放self。