繁体   English   中英

我应该使用带有属性和块/ ARC的属性的弱引用吗?

[英]Should I use a weak references with properties of a property and blocks / ARC?

我知道,当我们使用ARC和块时,应该使用__weak来防止强烈捕获自身并防止保留周期! 但是我想知道在下面的示例中是否需要使用__weak?

__weak MyViewController *weakSelf = self;
[self.personObject.gallery downloadLogoCompletionBlock:^(UIImage *image) {
                                        if (image) {
                                            weakSelf.logoImageView.image = image;
                                        }];

画廊不是在挡住自己,对吗? 如果是这样,我可以写:

self.logoImageView.image = image;

谢谢你的回答

在块内具有强大的参考self ,您将有一个(临时)保留周期

self -> _personObject -> _gallery -> BLOCK -> self

假设属性personObjectgallery由实例变量_personObject_gallery 调用完成模块后,保留周期将被“销毁”。 如果从未调用完成块,则永远不会释放self

因此,如果应该在调用完成块之前将self释放,则应使用弱引用。

这取决于。

假设您从导航控制器弹出此MyViewController实例,并且希望它取消分配。

假设gallery对块具有强引用,如果不使用弱引用,则会遇到保留周期。

personObject.gallery不会被释放,因为您的视图控制器也不会被释放,因为它首先被personObject.gallery的块保留。

另一种情况是gallery不保留该块,在这种情况下,您将不会遇到保留周期。

如果出于某种原因,您没有实现gallery实现中的代码块,那么最好使用弱引用,以防万一!

这将导致一个周期,只是更长的周期。

self -> personObject -> gallery -> block
  ^---------------------------------|

但是,此块的生存时间仅够调用一次,然后画廊应将其释放,从而打破了周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM