【问题标题】:Need to removeObserver before deallocation, but ARC forbids overriding dealloc [duplicate]需要在释放之前删除观察者,但 ARC 禁止覆盖 dealloc [重复]
【发布时间】:2014-10-25 15:04:50
【问题描述】:

我有一门课,RA_CustomCell : UITableViewCell。这个类的一些实例注册为另一个类RA_LocationSingleton中的变量currentLocation的观察者。

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'

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

【问题讨论】:

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


    【解决方案1】:

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

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

    来自Transitioning to ARC Release Notes, ARC Enforces New Rules 上的苹果文档:

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

    【讨论】:

      【解决方案2】:

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

      在苹果文档here中有解释

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 2011-12-11
        • 2010-11-02
        • 2013-03-31
        • 1970-01-01
        相关资源
        最近更新 更多