我知道当我们使用ARC和阻止时,我们应该使用__weak来防止强烈自我捕获并阻止保留周期! 但我想知道在下面的例子中我是否需要使用__weak?
__weak MyViewController *weakSelf = self;
[self.personObject.gallery downloadLogoCompletionBlock:^(UIImage *image) {
if (image) {
weakSelf.logoImageView.image = image;
}];
画廊保留了不是自我的块,对吗?如果是这样我可以写:
self.logoImageView.image = image;
感谢您的回答
答案 0 :(得分:0)
在块内有一个强引用self
,你将有一个(临时)保留周期
self -> _personObject -> _gallery -> BLOCK -> self
假设属性personObject
,gallery
由实例变量_personObject
,_gallery
备份。
一旦调用完成块,保留周期将被“销毁”。
如果从未调用完成块,则永远不能释放self
。
因此,如果在调用完成块之前可能会释放self
,
你应该使用弱引用。
答案 1 :(得分:0)
取决于。
假设您从导航控制器弹出此MyViewController
实例,并且您希望它可以解除分配。
假设gallery
拥有对该块的强引用,如果您没有使用弱引用,则会遇到保留周期。
personObject.gallery
将不会被取消分配,因为您的视图控制器也没有被释放,因为它首先被personObject.gallery
的块保留。
另一种情况是gallery
没有保留块,在这种情况下你不会遇到保留周期。
如果由于某种原因,你没有在gallery
的实现中使用块,那么使用弱引用总是一个好主意,以防万一!
答案 2 :(得分:0)
这会导致一个周期,比许多周期长。
self -> personObject -> gallery -> block
^---------------------------------|
然而,这个块只能存活一段时间才能被调用一次,然后画廊应该释放它,打破循环。