自定义dealloc和ARC(Objective-C)

Nik*_*iku 207 xcode objective-c dealloc ios automatic-ref-counting

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}
Run Code Online (Sandbox Code Playgroud)

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

这非常有效,除了我在TabBarController中有视图控制器.这是因为当标签栏加载时,它会从其子控制器中获取选项卡图标而不初始化视图,因此viewDidLoad:不会调用,因此这些视图控制器不会收到语言更改通知.因此,我将registerObject:调用移到了init方法中.

回来我viewDidLoad:以前和我的观察员一起注册时,我常常viewDidUnload:取消注册.由于我现在正在注册init,因此取消注册是很有意义的dealloc.

但这是我的问题.我写的时候:

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ARC禁止发送'dealloc'的显式消息

因为我需要打电话[super dealloc]来确保超级班级正常清理,但ARC禁止这样做,我现在卡住了.当我的物体死亡时,还有另一种获取信息的方法吗?

jus*_*tin 416

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

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

  • 如果view持有对observer的引用,并且observer持有对该视图的引用,那么我们有一个循环引用.因此视图的引用计数大于0,并且永远不会调用`dealloc`.在dealloc中调用`[observer unregisterObject:self]`是否有意义?我错过了什么? (3认同)