Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Ios 使用NavigationController时视图的内存管理_Ios_Uinavigationcontroller_Uitabbarcontroller_Viewdidload_Viewdidunload - Fatal编程技术网

Ios 使用NavigationController时视图的内存管理

Ios 使用NavigationController时视图的内存管理,ios,uinavigationcontroller,uitabbarcontroller,viewdidload,viewdidunload,Ios,Uinavigationcontroller,Uitabbarcontroller,Viewdidload,Viewdidunload,我将应用程序中的导航从使用UIDABBARCONTROLLER更改为u UINavigationController。也就是说,以前的解决方案第1版仅基于TabBarController-4 ViewController一个简单的TableView、一个简单的自定义视图和一个具有多个覆盖的MapView。第二个版本仅基于UINavigationController 对于TabBarController,它清晰简单,一切都很好,尤其是MapView。我的意思是:MapView加载了一次大量的覆盖图

我将应用程序中的导航从使用UIDABBARCONTROLLER更改为u UINavigationController。也就是说,以前的解决方案第1版仅基于TabBarController-4 ViewController一个简单的TableView、一个简单的自定义视图和一个具有多个覆盖的MapView。第二个版本仅基于UINavigationController

对于TabBarController,它清晰简单,一切都很好,尤其是MapView。我的意思是:MapView加载了一次大量的覆盖图,当我转到另一个视图并返回MapView时,MapView仍然在那里,覆盖图已经加载并显示。简单检查:MapView的viewDidLoad在每次应用程序运行时只调用一次,我在那里收到一些调试消息

现在我将导航逻辑更改为UINavigationController。对于第一次查看,一切都正常-但是:每次导航到视图时,都会调用每个视图的viewDidLoad。这是恼人的,尤其是在MapView的情况下——每次都会加载覆盖,这需要一些时间,在某些情况下会导致应用程序崩溃

好,我的问题是:

这是NavigationController的某种常见行为吗

我是否可以更改此行为,以便只调用一次viewDidLoad

还有更多-如何影响某些视图的显示顺序

我知道逻辑可能更复杂,但我欣赏任何答案或暗示

一些相关情况:

选项卡栏和导航控制器不合并。 我使用故事板,分段是在UIB中设计的,在我的代码中没有像perfomSegue或prepareForSegue这样的手动调用。一个按钮可触发切换至地图视图。 我使用推式分段。 我也尝试使用模态分段,但没有改变这种行为。 在视图之间的分段期间,不会调用任何viewDidUnload。 没有收到内存警告。 在模拟器和iPhone4上均未检测到内存泄漏。 我试图构建一个非常简单的临时项目/应用程序,它只关注导航。控制器和其他视图没有任何编码,只是情节提要。这是同样的行为。 当我在一个视图和地图视图之间快速并定期点击导航按钮和后退按钮时,出现了一个导致应用程序崩溃的问题。在大多数情况下,当我在地图视图(即其覆盖图)完全显示之前点击后退按钮时,应用程序崩溃。当我加上1秒时,它被修复了。视图中的延迟方法调用在MapView中消失。我知道这不公平; UIAbbarController和UINavigationController基于根本不同的范例

UIDABBARCONTROLLER旨在使每个选项卡上的UIViewController彼此独立存在,并让用户选择要查看的内容。viewDidLoad对于每个UIViewController只被调用一次,因为即使用户切换到不同的选项卡,每个选项卡仍然存在于内存中


UINavigationController是UIViewController的堆栈,其中每个都与自身上下的UIViewController相关。堆栈中的顶部UIViewController始终是用户可见的。当UIViewController被推送到堆栈时,会调用它的viewDidLoad,因为它正在加载到内存中。当顶部UIViewControllergets从堆栈中弹出时,它将从内存中卸载,并在退出时调用viewDidUnload viewDidUnload在iOS6中已被弃用,不会被调用,但控制器仍将从内存中转储。这就是为什么每次用户将特定UIViewController推送到UINavigationController堆栈上时都会调用viewDidLoad的原因。

UIAbbarController和UINavigationController基于根本不同的范例

UIDABBARCONTROLLER旨在使每个选项卡上的UIViewController彼此独立存在,并让用户选择要查看的内容。viewDidLoad对于每个UIViewController只被调用一次,因为即使用户切换到不同的选项卡,每个选项卡仍然存在于内存中


UINavigationController是UIViewController的堆栈,其中每个都与自身上下的UIViewController相关。堆栈中的顶部UIViewController始终是用户可见的。当UIViewController被推送到堆栈时,会调用它的viewDidLoad,因为它正在加载到内存中。当顶部UIViewControllergets从堆栈中弹出时,它将从内存中卸载,并在退出时调用viewDidUnload viewDidUnload在iOS6中已被弃用,不会被调用,但控制器仍将从内存中转储。这就是为什么每次用户将特定UIViewController推送到UINavigationController堆栈上时都会调用viewDidLoad的原因。

您有一个输入错误--在ios6中不推荐使用viewDidLoad,而不是-viewDidLoadGood catch!现在已经修好了。谢谢,而且有人打电话给你
在退出的过程中不会,在iOS 6之前。viewDidUnload仅在卸载视图时调用。视图仅在内存不足的情况下卸载。99%的情况下,你永远不会看到视图被卸载。你有一个打字错误——viewDidUnload在ios6中被弃用,而不是-viewDidLoadGood catch!现在已经修好了。谢谢。viewDidUnload在退出时会被调用不,在iOS 6之前的版本中不会。viewDidUnload仅在卸载视图时调用。视图仅在内存不足的情况下卸载。99%的情况下,您永远不会看到视图被卸载。在导航控制器上推送地图类时,在分配地图类之前,请检查其是否为零,如果为零,则分配它,否则直接在导航控制器上推送地图类。在导航控制器上推送地图类时,在分配地图类之前,请检查其是否为零,如果为nil,则分配它,否则直接在导航控制器上推送map类。