弱自我作为一个iVar

时间:2013-10-01 23:32:51

标签: ios objective-c memory-leaks weak-references

我知道你应该在块中使用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];
}

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

引发这种想法的问题是[_weakSelf something]在引擎盖下与[self->_weakSelf something]完全相同。

因此,即使您尝试使用弱引用,最终也会使用强引用来获取弱引用并捕获它们。