【问题标题】:Why could weak-strong dance break retain cycle?为什么弱强舞会保持循环?
【发布时间】:2018-09-12 11:05:22
【问题描述】:

这是我的代码:

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执行时,block会强引用self,但是如果self没有同时释放,self也是强引用block。会不会导致retain cycle?

【问题讨论】:

  • 乍一看,您似乎在这里将 pointerreference 混合在一起;只要实例的指针相同,引用的范围也完全不同。

标签: ios objective-c


【解决方案1】:

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

  • 块不保留self 的强引用,它保留弱引用。
  • selfstrongSelf 不相同。
  • strongSelfweakSelf 的强引用而不是 self,因此不会导致保留循环。
  • 如果在块执行时self 没有被释放,strongSelf 将是self 的强引用。但是strongSelf 是一个局部变量,它只会让 self 在 block 完全执行之前不能被释放。

【讨论】:

  • 突然明白了关于retain cycle的困惑,block执行时,不会引用self。我同意你的第一个意见,但第二个和第三个我不同意。因为,weakSelfstrongSelf 具有相同的值。 weakSelfstrongSelf指向同一个对象,你的意思是strongSelf指向weakSelf
  • 我的意思是当你写__strong typeof(weakSelf) strongSelf = weakSelf;时,strongSelf指向weakSelf指向的对象。如果weakSelf指向selfstrongSelf 将是self的强引用。但是如果self被释放,此时weakSelf指向nil,所以strongSelf将指向@987654348 @太
  • 我假设 当块执行时 self 没有被释放。现在,我认为这个问题的关键是block在执行时不会强引用self,因为只有在捕获self时才会block强引用self。谢谢!
  • 如果执行块时 self 没有被释放,strongSelf 将是self 的强引用。但是strongSelf 是一个局部变量,它只会使self 在块完全执行之前不能被释放。这就是关键。
  • 是的,block 不会强引用self,我混合它。谢谢~
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2018-10-09
  • 2012-11-07
  • 2010-10-23
  • 2016-04-21
相关资源
最近更新 更多