自定义dealloc和ARC(Objective-C)

时间:2011-09-03 08:50:56

标签: objective-c ios xcode dealloc automatic-ref-counting

在我的小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禁止这样做,我现在卡住了。当我的物体死亡时,还有另一种获取信息的方法吗?

1 个答案:

答案 0 :(得分:411)

使用ARC时,您根本不会显式调用[super dealloc] - 编译器会为您处理它(如Clang LLVM ARC document, chapter 7.1.2中所述):

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