这是我的代码:
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
属性。
我得到了这样的日志:
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会强烈引用self,但如果self在同一时间没有被释放,self也会强引用块。它会导致保留周期吗?
答案 0 :(得分:2)
在我看来,它不会导致保留周期。我认为你误解了一些观点。
self
的强引用,它会保留一个弱引用。self
和strongSelf
不相同。strongSelf
是weakSelf
而非self
的强引用,因此不会导致保留周期。self
,则strongSelf
将成为self
的强引用。但是strongSelf
是一个局部变量,只有在完全执行块之后才能释放self。