我正在处理一个问题,在这个问题中,块内使用的对象不会释放。
首先我有这个代码:
__block SOMABannerView* bannerView=_bannerView;
self.viewWillDissappearObserver = [center addObserverForName:UIViewWillDissappearNotification object:self.delegate.viewControllerForPresentingModalView queue:mainQueue usingBlock:
^(NSNotification *note) {
[bannerView setAutoReloadEnabled:NO];
}];
我使用了__block,因为据说它不会复制并保留对象,但是当我用Instruments分析这段代码时,我注意到SOMABannerView类中的对象没有被释放,所以我把它改成了:
self.viewWillDissappearObserver = [center addObserverForName:UIViewWillDissappearNotification object:self.delegate.viewControllerForPresentingModalView queue:mainQueue usingBlock:
^(NSNotification *note) {
[_bannerView setAutoReloadEnabled:NO];
}];
哪个也没用,所以我最后使用NSNotificationCenter中的另一个方法来避免阻塞,但我仍然不明白为什么__block保留了这个对象,有人可以为我澄清一下吗?我有一个错误的__block概念吗?
答案 0 :(得分:3)
它不会在非ARC环境中保留对象,但将在ARC环境中。对于ARC,请使用__weak
代替__block
。
来源:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#blocks