需要在释放之前删除Observer,但ARC禁止覆盖dealloc

时间:2014-09-01 11:31:54

标签: ios objective-c location observer-pattern dealloc

我上课了,RA_CustomCell : UITableViewCell。此类的某些实例注册为另一个类currentLocation中变量RA_LocationSingleton的观察者。

RA_CustomCell.m

-(void)awakeFromNib
{
    [self registerAsListener]
}

-(void)registerAsListener
{
    if ([self.reuseIdentifier isEqualToString:@"locationcell1"])
    {
        [[RA_LocationSingleton locationSingleton]
               addObserver:self
                forKeyPath:@"currentLocation"
                   options:NSKeyValueObservingOptionNew
                   context:nil];
    }
}

然而,当用户向后导航时,这些单元格会自然解除分配。问题是当currentLocation变量自身更新时,我收到以下崩溃错误:

*** -[RA_CustomCell retain]: message sent to deallocated instance 0x9bd9890

不幸的是,我无法覆盖-dealloc,因为我正在使用ARC,而输入[super dealloc]会产生以下警告:

ARC forbids explicit message send of 'dealloc'

我的问题是,我应该如何管理我的位置监听器以避免这种崩溃?

2 个答案:

答案 0 :(得分:3)

只需使用dealloc而不调用[super dealloc]

- (void)dealloc {
   [[RA_LocationSingleton locationSingleton] removeObserver:self
                                                 forKeyPath:@"currentLocation"
                                                    context:nil];
}

来自Transitioning to ARC Release Notes, ARC Enforces New Rules上的apple doc:

  

ARC中的自定义dealloc方法不需要调用[super dealloc]   (它实际上导致编译器错误)。超级链接是   自动化并由编译器强制执行。

答案 1 :(得分:0)

您可以覆盖dealloc,只是自动为您调用[super dealloc]

苹果文档here

中对此进行了解释

“ARC中的自定义dealloc方法不需要调用[super dealloc](它实际上会导致编译器错误)。超级链接由编译器自动执行。”