问题标签 [didreceivememorywarning]
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.
ios - 为什么我的一些视图控制器没有收到 didReceiveMemoryWarning?
我的 iPad 应用程序中的根级视图控制器是 UISplitViewController。因此,它有 2 个视图控制器:
- 一个主视图控制器(viewControllers 属性的第 0 项)
- 一个细节视图控制器(viewControllers 属性的第 1 项)
详细视图控制器是一个自定义视图控制器,我根据主视图控制器中的点击和事件进行更改。
要更改此详细视图控制器,我使用以下代码:
我的问题是,当我的应用程序收到内存警告事件时,didReceiveMemoryWarning
会为我的所有视图控制器调用该方法,但以前的详细视图控制器除外。而且它们没有被释放,因为它们仍然是其他对象的委托(包括可能仍在运行的异步方法)。
我的问题是:
- UIViewController 接收
didReceiveMemoryWarning
消息的规则是什么?为什么我以前的细节视图控制器没有收到它们? - 我可以在这些旧的视图控制器上安全地打电话
didReceiveMemoryWarning
或自己打电话吗?viewDidUnload
ios - 在 didReceiveMemoryWarning 之后 iOS UITableView 空白
我在这里有点茫然,我希望有人能指出我哪里出错了。
我的应用程序是适用于 iPad 的 Master/View 应用程序。
我的 MasterView 继承自 UITableView,只要没有 didReceiveMemoryWarning 就可以正常工作。我有自定义单元格内容,这一切都很好。到目前为止一切顺利,只花了几个小时就完成了。
然而,一旦我得到一个 didReceiveMemoryWarning,self.tableView 似乎表现得很奇怪。numberOfSectionsInTableView 和 tableView:numberOfRowsInSection: 方法不再被调用,当我的代码尝试选择第一项(在内存警告之后)时,如下所示:
它崩溃了
-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]:第 (0) 部分的行 (0) 超出边界 (0)。
那么给了什么?如果在内存警告期间我的 tableView 的内存被完全擦除,为什么不将它设置为 nil?另外我该如何重新构建它?
iphone - iPhone - 如何处理内存不足的情况
当应用程序收到内存不足警告消息时,可能会发生 3 种情况:
- 您的应用刚刚启动,用户没有做任何特别的事情
- 应用程序正在运行并且存在当前上下文
- 该应用程序在后台运行一些上下文
因此,当您收到此消息时,您应该释放内存...但是在哪里?如何 ?
我明白那个 :
initWith
.....必须设置默认的静态值。viewDidLoad
必须加载任何非静态对象didReceiveMemoryWarning
必须释放那些非静态对象- 我看不出在
viewDidUnload
...中可以/必须做什么
我猜某些保留值必须在某处设置为零……在 didReceiveMemoryWarning 中?
并且必须对活动上下文(屏幕的位置,显示的文本,...)做些什么,所以当再次调用 viewDidLoad 时,这些东西会再次出现在 memoryWarning 调用之前的位置?
我的意思是,想象两种情况:
方案 1
- 你正在做某事……你在一个字段中写了一些文本,没有保存它,打开另一个视图,在屏幕上移动了一个视图。
- 您在后台发送应用程序。
- 然后将 memoryWarning 发送到应用程序。
- 之后,用户将应用程序发送到前台:它应该显示他们在退出时的内容,在当前视图上和以前的视图上一样,但是如果所有内容都已发布,你该怎么做?
方案 2
- 你正在做某事……你在一个字段中写了一些文本,没有保存它,打开另一个视图,在屏幕上移动了一个视图。
- 然后将 memoryWarning 发送到应用程序。
- 您不想丢失视图中的内容,也不想丢失先前视图中的内容。您不希望屏幕因为释放/重新加载功能而闪烁。你怎么处理这个?
那么当这些内存警告发生时,除了将内容写入磁盘以稍后显示它们之外,您还有其他选择吗?
你什么时候再加载这些?我有一个加载(viewDidLoad)的viewController,接收一个memoryWarning,卸载(viewDidUnload),但是当回到它时,不会再次调用viewDidLoad?这必须在 viewWillAppear 中完成吗?我是否必须认为每当 viewWillAppear 被触发时,我可以假设应该在其上显示的内容已加载?
任何帮助,即使是有价值的链接,都会很棒!
谢谢您的帮助。
ios - 使用 ARC 的 UIDatePicker 内存泄漏
我正在制作一个应用程序,其中包含一些带有 UIDatePicker 控件的视图控制器。
在有很多内存警告之后,我已经对原因进行了很多调试。使用工具,我可以看到每当包含 UIDatePicker 的视图控制器出现时,内存使用量就会增加 2-3mb。最终,这会导致内存警告。虽然我可以在这里做很多事情,并且自从重写这些函数以来,崩溃的次数急剧减少,但我仍然对这种行为感到不舒服,并想修复它。
UIDatePicker 是 XIB 文件的一部分。我已经尝试将它们从 XIB 中取出并以编程方式添加它们。这并不能解决问题。我也尝试过使用(线程安全的)单例。这将内存使用限制为仅一个实例(因此内存使用不会增加),但我试图尽可能避免单例。我应该把它吸起来吗?使用单例?
我在运行它的所有设备上都在 iOS 5 和 4.3 上看到了这种行为。正如标题所示,我正在使用 ARC。
Instruments 没有显示任何内存泄漏。
这是 Instruments 的截图。使用的每一步都是在出现包含日期选择器的 VC 时。图表开头的基线是 2.3mb 的内存使用量。
http://i.stack.imgur.com/1S7ns.png
干杯!
ios - 收到 didReceiveMemoryWarning 时 UIImageViewController 的委托为 nil
我试图弄清楚为什么当我的应用程序在 UIImagePickerController 具有控制权的情况下获得 didReceiveMemoryWarning 时,选择器(以及选择器的委托)被设置为已释放的视图控制器?
视图控制器一次调用
接下来,显示 UIImageViewController 并选择图像。然后模拟内存警告。显示对话框的视图控制器收到内存警告错误,并且选择器设置为 0x0(这意味着委托现在也无效)。
我正在使用ARC。调用 UIImageViewController 的方式是否发生了变化,以使呈现它的视图不会重新加载,从而导致指向 UIImageViewController 的指针变得无效?
ios - 在 didReceiveMemoryWarning 和 viewDidUnload 之后使用 viewDidLoad
当 meory 警告发生时,我仍在尝试了解管理视图的过程。我在这个答案中收到了一些很好的信息,但我仍然有问题。
假设我有一个视图控制器VC1,其中包含一个由视图控制器VC2 管理的子视图(它具有该子视图它的视图属性)。最初,如果我想将 VC2 视图放入另一个 VC1 视图中,那么我可能会这样做:
稍后,在 VC2 中收到内存警告。所以调用了VC2的didReceiveMemoryWarning,接着调用了VC2的viewDidUnload。
这就是我的理解结束的地方(如果我已经说的是正确的话!)
我期望神奇地发生的是 VC2 中的视图及其资源可以被释放(例如,它可能是标签栏控制器引用的一个视图,但当前未显示),如果它应该可以正常工作都可以通过 VC2 的 viewDidLoad 方法重新创建。假设暂时看不到VC2的视图,应该是release了。
它究竟是如何发布的?didReceiveMemoryWarning 在 VC2 中执行。VC2是否发布了自己的观点?如果没有,假设会发生什么。
第二个问题,如果VC2的视图已经发布,假设再次需要该视图(比如有人在标签栏上选择了相应的标签)。我的理解是,如果引用了 VC2 的view 属性,则会调用 VC2 loadView 。最初,当 VC1 使用属性引用将其添加为子视图时,它被引用。标签栏控制器可以通过视图控制器 VC2 引用它来调用它,该控制器位于标签栏控制器的 viewControllers 数组中。所以我猜标签栏控制器将引用视图属性,这会导致调用 VC2 loadView。
好吧,我完成了第二个问题,并且可能同时回答了它。有人可以确认我是否理解正确吗?
此外,我仍然不清楚(如我的第一个问题)VC2 视图应该如何以及在何处发布。
是否有人可以向我指出一个教程,该教程介绍了发布视图和视图层次结构以响应内存警告的整个过程,还解释了在需要时如何重构已发布的视图?这真的有助于我理解这个过程。
iphone - 模态视图控制器因内存警告而被解雇?
我的应用程序中发生了一个间歇性错误,我终于能够通过在特定场景中模拟内存警告来始终如一地重现它。这是设置。
如果我在屏幕上显示模态控制器 2 时模拟内存警告,则模态控制器 1 将被关闭,底部导航控制器会一直弹回其根目录。这正是报告的错误中发生的情况。
如果用户随后按下 MC2 中的“完成”按钮,它会调用 MC1 中的委托方法,该方法会崩溃,因为内存警告导致 MC1 被卸载并解除分配。
在我的应用程序的其他地方,我有导航控制器呈现模式视图控制器链,但触发内存警告只会在我的应用程序的一个特定区域导致此问题。
有什么可能导致这种行为吗?我没有具体的代码示例,因为我不确定是什么代码导致了问题。我会很感激任何指示。
iphone - iOS 5 处理低内存情况的方式不同吗?
我只在 iOS 5.0 中遇到问题,在模式视图存在时收到的内存不足警告有时会让我出现白屏 - 我相信这是因为我的标签栏控制器释放了它的所有视图。
在 iOS 4.0 中,相同的场景不会导致问题。我能想到的解释有两种:
- iOS 5 使用更多内存,留给应用程序的内存更少
- iOS 5 以不同方式处理低内存情况
在 5.0 之前的版本中,我曾经能够通过释放一些额外的内存来响应内存不足的警告。在 5.0 中,似乎我第一次收到内存不足警告,我的模态视图控制器下的所有内容都清除了它的视图。跟踪确认,在内存警告之后,模态视图控制器下的任何控制器都将其view
字段设置为nil
.
谁能告诉我有关 iOS 5 与早期版本相比如何处理低内存情况的信息(最好来自 Apple)?我希望能够在必要时释放一些内存,而不是清除所有视图。
objective-c - 显示视图控制器时是否调用了 didReceiveMemoryWarning / viewDidUnload?
关于didReceiveMemoryWarning
/的问题viewDidUnload
。
如果我的应用程序有很多视图控制器,其中一个显示,其他返回(因为我使用导航控制器或标签栏控制器,没关系),哪些视图控制器将接收didReceiveMemoryWarning
/ viewDidUnload
,所有这些,只是隐藏,还是只显示?
显示的 VC 是否有可能收到didReceiveMemoryWarning
但没有viewDidUnload
(因为如图所示,它没有任何意义)。
顺便说一句,看到这张图后,我有这些问题:
非常感谢您的帮助。
ios - iOS 处理内存警告
我有一个UIViewController
显示为模态视图控制器的。在它看来,我有一个UITextView
4 个 ImageButtons(带有 CustomType)和另一个按钮(也是自定义类型),它允许拍照然后在该按钮中显示它。
接下来是问题:
- 假设我在 中设置了一些文本,
UITextView
并且 4 个 ImageButtons 中的每个都有一个图像。 - 然后我启动
UIImagePickerController
并收到内存警告(通常会发生什么),因此didReceiveMemoryWarning
被调用并 viewDidUnload。 - 当我从
UIImagePickerController
所有信息返回时,用户必须重新输入所有信息(并为按钮设置 4 张照片)。
所以问题是,我应该如何处理这种情况以避免用户重新输入所有内容?我应该将状态保存在 UserDefaults 中还是将旧信息存储在属性中,UIViewController
以便在再次调用时使用它们viewDidLoad
?
谢谢!