209

在我的小 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 禁止这样做,所以我现在被卡住了。当我的对象快要死去时,还有其他方法可以得到通知吗?

4

1 回答 1

422

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

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}
于 2011-09-03T08:59:51.323 回答