这是我的代码:
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();
blk
和 str
是属性(property)。我得到了这样的日志:
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
结论是
self
、 weakSelf
和 strongSelf
指向同一个对象,它们的不同只是强或弱。在我看来,self
和 strongSelf
是相同的。所以我认为这段代码的内存是这样的:我的困惑是当 block 执行时, block 将强引用自身,但如果自身没有同时释放,自身也是强引用 block 。它会导致保留循环吗?
最佳答案
在我看来,它不会导致保留周期。我认为你误解了一些观点。
self
的强引用,它保持弱引用。 self
和 strongSelf
不完全相同。 strongSelf
是 weakSelf
的强引用不是 self
所以它不会导致保留周期。 self
block 执行时未释放,strongSelf
将是 self
的有力引用.但是strongSelf
是一个局部变量,它只会使 self 在 block 完全执行之前无法被释放。 关于ios - 为什么弱强舞会保持循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624689/