![](/img/trans.png)
[英]Should I not use (nonatomic, weak) for UIViewController property?
[英]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
假设属性personObject
, gallery
由实例变量_personObject
, _gallery
。 调用完成模块后,保留周期将被“销毁”。 如果从未调用完成块,则永远不会释放self
。
因此,如果应该在调用完成块之前将self
释放,则应使用弱引用。
这取决于。
假设您从导航控制器弹出此MyViewController
实例,并且希望它取消分配。
假设gallery
对块具有强引用,如果不使用弱引用,则会遇到保留周期。
personObject.gallery
不会被释放,因为您的视图控制器也不会被释放,因为它首先被personObject.gallery
的块保留。
另一种情况是gallery
不保留该块,在这种情况下,您将不会遇到保留周期。
如果出于某种原因,您没有实现gallery
实现中的代码块,那么最好使用弱引用,以防万一!
这将导致一个周期,只是更长的周期。
self -> personObject -> gallery -> block
^---------------------------------|
但是,此块的生存时间仅够调用一次,然后画廊应将其释放,从而打破了周期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.