我上课了,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'
我的问题是,我应该如何管理我的位置监听器以避免这种崩溃?
答案 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](它实际上会导致编译器错误)。超级链接由编译器自动执行。”