Objective c 故事板和内存管理
我正在使用故事板,我偶然发现了一些我无法掌握的东西 我使用Objective c 故事板和内存管理,objective-c,memory,storyboard,Objective C,Memory,Storyboard,我正在使用故事板,我偶然发现了一些我无法掌握的东西 我使用performsguewithidentifier:以编程方式设置视图控制器 它的工作方式很有魅力,但我注意到,每次我这样做时,我都会创建一个viewController的新实例,因此,我的内存一直在堆积。当我模拟内存警告时,每次调用performsguewithidentifier: 我有一个视图控制器的新实例,它永远不会被释放。所以记忆堆积起来,我无法释放它,最终导致崩溃 我只是像这样转到视图控制器: // If sales are
performsguewithidentifier:
以编程方式设置视图控制器
它的工作方式很有魅力,但我注意到,每次我这样做时,我都会创建一个viewController的新实例,因此,我的内存一直在堆积。当我模拟内存警告时,每次调用performsguewithidentifier:
我有一个视图控制器的新实例,它永远不会被释放。所以记忆堆积起来,我无法释放它,最终导致崩溃
我只是像这样转到视图控制器:
// If sales are registered, go to view
[self performSegueWithIdentifier:@"previousSaleSegue" sender:self];
我在这里遗漏了什么?如果您确定viewcontroller实例没有被释放,那一定是因为您将引用保留在某个地方(它可能是控制器本身的一个循环)。您将把视图控制器堆叠在彼此的顶部,而不是返回到上一个。假设您使用的是导航控制器,您将执行以下操作:
A --push--> B --finished! Push---> New A ---Push---> B ---Finished! push--->A ...
你应该做的是:
A --push--> B --finished! Pop -
^-----------------------------/
您的注释使用的是模态分段,在这种情况下,您需要向返回按钮添加一个操作以关闭视图控制器(返回到上一个),而不是显示另一个实例。原理是一样的。你会用
[self dismissViewControllerAnimated:YES completion:nil];
在
performsguewithidentifier:
中向我们显示您的代码。完成,但它没有什么特别之处。我真的看不出我是如何引用它的。我不会在任何时候创建对视图控制器的手动额外引用。我没有使用导航控制器,但概念可能是相同的?PerformsgueWithIdentifier创建一个新实例并在堆栈上抛出。那么,如果我必须返回到上一个序列,我必须“dismissViewController”才能删除它?这就是理解的方式吗?:)如何“返回到上一个序列”?使用故事板序列,直接从样式为modalYes的返回按钮拖动它,使用dismissViewController。