1

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

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

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

self.logoImageView.image = image;

感谢您的回答

4

3 回答 3

0

通过块内的强引用self,您将拥有一个(临时)保留周期

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

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

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

于 2013-10-17T14:40:58.910 回答
0

这取决于。

假设您MyViewController从导航控制器中弹出此实例,并希望它释放。

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

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

另一种情况是gallery不保留块,在这种情况下您不会进入保留周期。

如果由于某种原因,您不知道 的实现中的块发生了什么gallery,那么使用弱引用总是一个好主意,以防万一!

于 2013-10-17T14:41:59.693 回答
0

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

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

然而,这个块的寿命只能被调用一次,然后画廊应该释放它,打破循环。

于 2013-10-17T14:42:23.117 回答