自定义dealloc和ARC (Objective-C)

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

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

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

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

回到我使用viewDidLoad:向观察者注册时,我使用viewDidUnload:取消注册。因为我现在在init中注册,所以在dealloc中取消注册很有意义。

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

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

我得到这个错误:

ARC禁止显式发送'dealloc'消息

因为我需要调用[super dealloc]来确保超类正确地清理,但ARC禁止这样做,所以我现在陷入了困境。当我的对象死亡时,是否有其他方法来获得通知?

72085 次浏览

当使用ARC时,你只是不显式地调用[super dealloc]——编译器为你处理它(如Clang LLVM ARC文档,第7.1.2章中所述):

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