问题标签 [viewdidunload]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1151 浏览

ios - 使用 NavigationController 时视图的内存管理

我将应用程序中的导航从使用 UITabBarController 更改为 u UINavigationController。即以前的解决方案(第 1 版)仅基于 TabBarController - 4 个 ViewControllers(一个简单的 TableView、一个简单的自定义视图和一个带有许多叠加层的 MapView)。第二个版本仅基于 UINavigationController。

在 TabBarController 的情况下,它清晰简单,一切正常,尤其是 MapView。我的意思是:MapView 被加载一次(有大量的叠加层),当我转到另一个视图并返回 MapView 时,MapView 仍然在那里,它的叠加层已经加载并显示(简单检查:调用 MapView 的 viewDidLoad每个应用程序运行一次,我在那里有一些调试消息)。

现在我将导航逻辑更改为 UINavigationController。第一眼一切都很好 - 但是:每次我导航到视图时都会调用 viewDidLoad (对于每个视图)。这很烦人,尤其是在 MapView 的情况下 - 每次都会执行叠加层的加载,这需要一些时间,并且在某些情况下会导致应用程序崩溃。

好的,我的问题:

  1. 它是 NavigationController 的某种“常见”行为吗?

  2. 我可以更改此行为,以便仅调用一次 viewDidLoad 吗?

  3. 还有更多 - 如何影响某些视图的“显示顺序”?

我理解逻辑可能更复杂,但我很感激任何答案或提示;)

一些相关情况:

  • TabBar 和 Navigation 控制器未组合。
  • 我使用故事板,在 UIB 中设计了 segue,在我的代码中没有像 perfomSegue 或 prepareForSegue 这样的手动调用。一键触发到 MapView 的 segue。
  • 我使用 push segues。
  • 我也尝试使用模态序列,但没有改变这种行为。
  • 在视图之间的 segues 中永远不会调用任何 viewDidUnload。
  • 未收到内存警告。
  • 在模拟器和 iPhone 4 上都没有测量到内存泄漏。
  • 我试图构建一个非常简单的临时项目/应用程序,它只关心导航。没有任何编码的控制器和其他视图,只是故事板。这是同样的行为。
  • 当我在一个视图和 MapView 之间快速并定期点击导航按钮和后退按钮时,出现了一个导致应用程序崩溃的问题。在大多数情况下,当我在 MapView 完全显示(即其覆盖)之前点击返回按钮时,应用程序崩溃了。当我添加 1 秒时,它已修复。在 MapView 中 viewDidDisappeared 中的延迟方法调用。我知道,这不是一个公平的解决方案;)
0 投票
2 回答
1592 浏览

ios6 - iOS 6 中的 NSNotification 和 didReceiveMemoryWarning

从 iOS 6.0 开始,不推荐使用 viewDidUnload 方法。在 iOS 6 之前,我曾经在 viewDidUnload 方法中删除 NSNotification 的Observer。但由于它已弃用,我已将其移至 didReceiveMemoryWarning。现在,如果我的应用收到低内存警告,通知将被删除。所以我用 NSNotification 编写的代码不起作用。

谁能告诉我如何解决这个问题?

提前致谢。

0 投票
1 回答
1324 浏览

ios - 加载 viewcontroller 后 App 运行缓慢,然后卸载约 15-20 次

使用:Xcode 4.6 Storyboards ARC Model segue to SecondViewController

我有一个应用程序,它的主 ViewController 会在设备向右旋转时加载一个新的 veiwController。当应用程序启动时,一切正常。如果我旋转设备,然后返回卸载 secondview 控制器,大约 15-20 倍的应用程序非常缓慢。我已经缩小范围,它仅在加载第二个视图控制器并且仅当我旋转设备数次时才会发生。我也缩小了范围,这是一个内存问题。我安装了一个应用程序来跟踪使用和可用的内存。当我多次旋转设备时,我的内存从 400mb 变为 900mb。我试图提供尽可能多的信息。每个视图都有 8 个每秒触发的 NSTimer。

有没有办法以编程方式卸载视图,以确保正在卸载?

我已包含此代码以确保加载和卸载:

`- (void)setView:(UIView *)aView { NSLog(@">>> 输入 %s <<<", PRETTY_FUNCTION );

}

日志结果:2013-04-22 16:42:03.588 xxxxxxxx[xxxxxxx] >>> 进入 -[GraphViewController setView:] <<< 2013-04-22 16:42:03.589 xxxxxxxx[xxxxxxx] <<< 离开 -[ GraphViewController 设置视图:] >>>

` 我不确定我需要看什么来纠正这个问题。

任何朝着正确方向的“点”都将不胜感激。

谢谢

0 投票
0 回答
197 浏览

objective-c - 在 XCode 4.6.2 中,为什么在 UITextView 上创建插座会自动生成 viewDidUnload 方法

我在情节提要中制作了一个简单的“关于”视图。基本上它只有一个UITextView. 它的控制器如下所示:

我想为 UITextView 添加一个插座,这样我就可以在代码中添加一些圆角。当我Ctrl+ 从情节提要向上拖动@interfaceand@end并调用插座aboutBlurb时,我的AboutViewController.m变为以下内容:

我的问题是,为什么 XCode 会插入viewDidUnload方法并设置nil我的aboutBlurb属性?我认为使用 ARC,方法中nil的属性viewDidUnload是不必要的。此外,我认为 Apple 在 iOS 6 中完全弃用了该方法。自动生成该方法viewDidUnload是否有合理的原因,或者我可以安全地删除它吗?viewDidUnload

0 投票
2 回答
107 浏览

objective-c - 在 ios 5.0 和 ios 6.0 中管理 View 插座

我正在开发一个转换为 ARC 的 iPad 应用程序。应用程序适用于 os >= ios 5.0。所以我的疑问是,我该如何管理 viewOutlets?我使用 -(void)didReceivememoryWarning 将 ViewOutlets 设置为 nil。但在 ios 5.0 和 5.1 应用程序中显示大量内存泄漏。由于 -(void)viewDidUnload 在 ios 6.0 中已弃用,因此我在应用程序中没有使用相同的。管理网点的方法正确吗?请给我一个快速的答复。

0 投票
1 回答
66 浏览

ios - 在基于 ARC 的 APP 中释放内存?

我使用了很多NSDictionariesand NSArrays,所以目前正在分配所有内容viewDidload并使所有内容为零ViewDidDisappear

现在我的记忆力会下降对吗?

0 投票
2 回答
156 浏览

ios - iOS UIViewController,为什么viewDidUnload中的“self”变成了“wild pointer”?

我的代码片段:

在极少数情况下,我的应用程序崩溃了self.noDataView = nil;。当我调试时po self,似乎它指向的不是当前控制器。可能的原因是什么?

PS:self.tableView's delegateanddataSource设置为selfininit方法。这和这个有关系吗?

0 投票
1 回答
209 浏览

ios - 从项目的视图控制器中删除所有 -viewDidUnload 的方法

正如苹果官方文档所说:

-viewDidUnload在 iOS 6.0 中已弃用。在低内存条件下不再清除视图,因此永远不会调用此方法。

同时,最好-viewDidUnload从部署目标为 iOS 6.0 或更高版本的项目中删除所有实现。但是一个一个移除它很无聊,尤其是你有数百个控制器和几个项目。

那么,是否有任何脚本或命令可以执行此批处理作业?

0 投票
2 回答
4530 浏览

swift - 为 NSNotificationCenter = Swift deinit() 调用 .removeObserver 的正确位置?

我已经阅读了很多关于为 NSNotificationCenter 调用 .removeObserver 的正确位置的建议,因为 viewDidUnload 不是一个选项。

我只是想知道 Swift 中的新 deinit() 是否是一个不错的选择?

-缺口

0 投票
1 回答
240 浏览

ios - MvvmCross 中的生命周期

我有一个 Mvvmcross 应用程序,它在根目录中有一个 TableViewController。每行打开一个 DetailViewController。在其中的每一个中,您都可以在 EditViewController 中对其进行编辑。

所以我为每个视图都有一个 ViewModel。我在这里处理两个问题:

1)在 DetailViewController 我订阅它到数据库消息。当我关闭它时,我必须处理这个 subscribeToken。所以当 DetailViewController 被破坏时,我需要调用它。但是当它消失时不能调用它,因为当我打开 editViewController 时,它会发送一条 DetailViewController 必须听的消息。

所以我不能在 ViewDidDisappear 方法中处理它。但另一个选项是在 ViewDidUnload 中。但是这个方法只在 MemoryWarnings 中调用。所以它没有处理令牌。这是不好的 。

2) 另一个问题是:对于我打开的每个 DetailsViewcontroller,我必须在设置中保存当前 ID。然后当我离开时,我必须将其从“设置”中删除。所以这里同样的问题。如果我在 ViewDidDisappear 中删除它,当我在 EditViewController 中时它会被删除,但我不能,它必须在那里设置。但是,如果我仅在 ViewDidUnload 中删除它将不会被调用,并且必须删除此变量。

我什么时候应该对这两种情况调用 OnDestroy 方法?

在 Android 中,我正在调用 OnDestroy。我应该在 iOS 哪里调用它?

感谢您的问候,