有人可以为我澄清这个障碍吗?

时间:2013-05-15 02:14:09

标签: ios objective-c memory-leaks objective-c-blocks

我正在处理一个问题,在这个问题中,块内使用的对象不会释放。

首先我有这个代码:

__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概念吗?

1 个答案:

答案 0 :(得分:3)

它不会在非ARC环境中保留对象,但在ARC环境中。对于ARC,请使用__weak代替__block

来源:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#blocks