1

我知道你应该在 block 中使用 weakSelf 来避免保留内存循环。喜欢:

__weak id weakSelf = self;
self.block = ^{
    [weakSelf something];
}

但我试图找到一种通用的方法。我可以使用如下宏:

#define Weakify(o) __weak __typeof__((__typeof__(o))o)
#define WeakifySelf(o) Weakify(self) o = self;

WeakifySelf(weakSelf)
self.block = ^{
    [weakSelf something];
}

这简化了,但我想知道为什么我不能在我的 viewController 上使用 ivar。

@interface YDViewController : UIViewController
{
    __weak id _weakSelf;
}

然后使用这个 iVar

self.block = ^{
    [_weakSelf something];
}

任何想法?

4

1 回答 1

7

下沉这个想法的问题[_weakSelf something]是,在引擎盖下,与[self->_weakSelf something].

因此,即使您尝试使用弱引用,最终还是会使用强引用来获取弱引用并同时捕获两者。

于 2013-10-01T23:36:34.990 回答