我在我的iPad应用程序中有一个“切换语言”功能,它使用观察器。每个视图控制器在其viewDidLoad:
期间向我的观察器注册自己。
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
当用户点击“更改语言”按钮时,新语言被存储在我的模型中,观察者会被通知并在其注册的对象上调用updateUi:
选择器。这个方法非常有效,但是当我有TabBarController中的视图控制器时,就会遇到问题。这是因为当tab条加载时,它从它的子控制器获取tab图标而不初始化视图,所以viewDidLoad:
不会被调用,所以这些视图控制器不会接收到语言更改通知。因此,我将我的registerObject:
调用移到了init
方法中。以前我使用
viewDidLoad:
来向观察者注册,我使用viewDidUnload:
来取消注册。由于我现在在init
中进行注册,因此在dealloc
中取消注册非常合理。但是我遇到的问题是:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
我遇到了这个错误:
ARC禁止显式调用'dealloc'的消息发送
由于我需要调用[super dealloc]
来确保超类正确地清理,但ARC禁止那样做,现在我被卡住了。有没有另一种方式可以在对象即将销毁时得到通知?