我知道你应该在块中使用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];
}
有什么想法吗?
答案 0 :(得分:7)
引发这种想法的问题是[_weakSelf something]
在引擎盖下与[self->_weakSelf something]
完全相同。
因此,即使您尝试使用弱引用,最终也会使用强引用来获取弱引用并捕获它们。