定制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) }