Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 故事板和内存管理_Objective C_Memory_Storyboard - Fatal编程技术网

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。