解雇视图控制器是否会调用ViewController的析构函数

时间:2015-04-04 23:13:34

标签: ios objective-c

我有两个视图控制器ViewControllerAViewControllerB

现在ViewControllerA通过此操作启动ViewControllerB

 self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/
[self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller

现在在ViewControllerB中我将控件返回到ViewControllerA

 [self dismissViewControllerAnimated:YES completion:Nil];

我的问题是ViewControllerB的析构函数会被调用吗?我是否需要alloc再次显示它?

2 个答案:

答案 0 :(得分:3)

你可能没有正确地考虑这个问题。此行创建了对新ViewControllerB实例的强引用:

self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/

(不要在你的变量名中添加下划线;这会让ObjC感到困惑,而且Cocoa依赖的键值编码约定也不好。)

此行可能是(但不是您的业务)为视图控制器添加了额外的保留:

[self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller

此行可能是(但不是您的业务)从视图控制器中删除了一个保留:

[self dismissViewControllerAnimated:YES completion:Nil];

所以,将可能确定的东西加在一起,那就是+1,+ 1,-1。所以你仍然有一个保留在对象上,并且它不会被释放(dealloc与析构函数不同;它与C ++有关并且具有不同的语义)。

如果在解除视图控制器之后,将self.view_library设置为其他内容,则将从对象中删除其保留,并且(如果没有其他任何内容保留它),视图控制器将被释放。

重点是你需要专注于平衡你的保留和释放,这主要由ARC处理(一个在你分配给一个强变量时保留,一个在强变量停止引用它时被释放) )。

对于您的具体问题,是的,应该可能重新创建视图控制器。这是常见的解决方案,即使并非总是需要它。

答案 1 :(得分:0)

如果您使用ARC且self.view_librarystrong引用,则不会取消分配,因此您不需要再次alloc