定制dealloc和ARC(Objective-C)

在我的小iPad应用程序中,我有一个使用观察者的“切换语言”function。 每个视图控制器在其viewDidLoad:注册自己的观察者viewDidLoad:

 - (void)viewDidLoad { [super viewDidLoad]; [observer registerObject:self]; } 

当用户点击“更改语言”button时,新语言被存储在我的模型中,观察者被通知并且在其注册对象上调用updateUi:select器。

这工作得很好,除了当我在TabBarController视图控制器。 这是因为当标签栏加载时,它从它的子控制器中提取标签图标而不初始化视图,所以viewDidLoad:不被调用,所以这些视图控制器不会收到语言改变通知。 因此,我将registerObject:调用移动到init方法中。

当我使用viewDidLoad:回到我的观察者注册,我使用viewDidUnload:注销。 因为我现在正在init注册,所以在dealloc取消注册非常有意义。

但是,这是我的问题。 当我写:

 - (void) dealloc { [observer unregisterObject:self]; [super dealloc]; } 

我得到这个错误:

ARC禁止“dealloc”的显式消息发送

因为我需要调用[super dealloc]来确保超类正确地清理,但是ARC禁止,我现在被卡住了。 有什么方法可以在我的物体快要死的时候得到通知?

使用ARC时,不要显式调用[super dealloc] – 编译器会为您处理它(如Clang LLVM ARC文档第7.1.2章中所述 ):

 - (void) dealloc { [observer unregisterObject:self]; // [super dealloc]; //(provided by the compiler) }