不关闭ViewController的视图控制器调用析构函数

问题描述:

我有两个视图控制器ViewControllerAViewControllerB不关闭ViewController的视图控制器调用析构函数

现在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它再次显示它?

您可能没有正确想到这一点。该行创建了一个强引用新ViewControllerB实例:

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

(不要把下划线在变量名,这是令人困惑ObjC和坏的可可依赖于键 - 值编码约定)

此行可能(但不是你的企业)增加了一个额外保留视图控制器:

[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为您处理的(当您分配给强变量时保留一个,当该强变量停止引用时保留一个它)。

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

如果你使用ARC和self.view_librarystrong引用它不会被释放,所以你不需要再次使用alloc它。

+0

所以简而言之,它不会调用析构函数?如果它不是一个强有力的参考呢? – 2015-04-04 23:58:48

+0

它不释放对象。如果它没有'strong'引用,它应该是dealloc,并且您需要重新分配对象以便再次'presentViewController'。 – DrKey 2015-04-05 00:14:34