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

时间:2013-10-17 14:22:33

标签: iphone ios objective-c automatic-ref-counting objective-c-blocks

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

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

画廊保留了不是自我的块,对吗?如果是这样我可以写:

self.logoImageView.image = image;

感谢您的回答

3 个答案:

答案 0 :(得分:0)

在块内有一个强引用self,你将有一个(临时)保留周期

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

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

因此,如果在调用完成块之前可能会释放self, 你应该使用弱引用。

答案 1 :(得分:0)

取决于。

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

假设gallery拥有对该块的强引用,如果您没有使用弱引用,则会遇到保留周期。

personObject.gallery将不会被取消分配,因为您的视图控制器也没有被释放,因为它首先被personObject.gallery的块保留。

另一种情况是gallery没有保留块,在这种情况下你不会遇到保留周期。

如果由于某种原因,你没有在gallery的实现中使用块,那么使用弱引用总是一个好主意,以防万一!

答案 2 :(得分:0)

这会导致一个周期,比许多周期长。

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

然而,这个块只能存活一段时间才能被调用一次,然后画廊应该释放它,打破循环。