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

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

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

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