我有两个视图控制器ViewControllerA
和ViewControllerB
。
现在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
再次显示它?
答案 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_library
有strong
引用,则不会取消分配,因此您不需要再次alloc
。