- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我不明白为什么 iOS 会因为内存使用而终止我的应用程序(iPad、iOS 4),即使在我释放大量内存以响应低内存警告之后也是如此。例如,这是一个典型的终止场景,我经常记录内存使用情况——查看“app”使用情况,每行的第一个 KB 值:
...
2011-12-14 13:25:42.343 Oyster[211:707] Memory usage (KB): app 268256, delta 6472, used 366800/373940
2011-12-14 13:25:43.292 Oyster[211:707] Memory usage (KB): app 273900, delta 5644, used 372444/381024
2011-12-14 13:25:44.159 Oyster[211:707] Memory usage (KB): app 282920, delta 9020, used 381464/389116
2011-12-14 13:25:45.184 Oyster[211:707] Memory usage (KB): app 272140, delta -10780, used 370684/379432
2011-12-14 13:25:46.109 Oyster[211:707] Memory usage (KB): app 260412, delta -11728, used 358956/365900
2011-12-14 13:25:48.443 Oyster[211:707] Received memory warning. Level=2
2011-12-14 13:25:48.454 Oyster[211:707] Memory usage (KB): app 9172, delta -251240, used 107716/112548
(gdb)
您可以看到应用内存使用量不断增加,直到它收到内存警告。然后我正确地响应了内存警告并释放了一堆(250MB!)内存。那时我的应用程序终止,iOS 转到 iPad 主屏幕。
此处的“内存使用”日志与我的 logMemoryUsage() function 一起显示它基于 this answer 中的代码.
为了记录,我正在使用 SDWebImage在内存中缓存 UIImages,但如图所示,它通过清空缓存(此时相当大)来处理内存警告。我意识到我可以调整 SDWebImage 的缓存以不填满所有可用内存并等待内存警告,但这引出了以下问题......
为什么 iOS 会终止我的应用程序,即使我通过愉快地释放大量内存来响应内存警告?
最佳答案
这是对内存管理等良好实践的一般回答。一般来说,听起来内存中的缓存只是变得太大了,即使它释放对象以响应内存警告,到那个时候它也太大了晚了。
内存警告本身并不是“坏”的,您无法避免它们。它们是 iOS 生命周期的正常组成部分,您必须通过释放所有对象中的所有非必要数据来正确处理它们,以确保您的应用程序以负责任的方式运行。即使您的应用程序占用空间很小,您仍然可能会收到有关设备上其他情况的内存警告 b/c(例如,正在使用的其他应用程序等)。我在这里指的是运行时通知 UIApplicationDidReceiveMemoryWarningNotification
。调试器消息(例如“收到内存警告。Level=2”)特定于您的应用,但它们不一定与接收运行时通知相关。
我不太了解SDWebCache
。我会查看实现并确保它有效地释放内存。例如,在相关位置使用 @autoreleasepool
可能有助于它在运行循环中更有效地释放对象。
您应该尽量限制应用程序的内存占用。对图像数据使用内存缓存很好,但我会限制它的大小。如果您的应用程序的占用空间超过 250MB,即使您处理内存警告,我也不会感到惊讶它会被终止。到那时可能为时已晚。
您可能有其他问题导致/促成终止。正如评论所建议的那样,您需要在仪器中进行更多调试以查找泄漏、访问错误等。在此处发布崩溃日志会有所帮助。
关于objective-c - 为什么即使我释放了大量内存以响应内存警告,iOS 也会终止我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510252/
我有一个附加了 View Controller 的 AVAudioPlayer 实例。 @property (nonatomic, retain) AVAudioPlayer *previewAudi
我是java初学者。假设我声明了一个 Account 类型的变量 Account _account = new Account("Thomas"); 然后在其他地方我做了这样的事情: _account
我在我的应用程序中使用了 3 个 UIViewController,现在我想知道当我从另一个应用程序切换到另一个 UIViewController 时释放它们是否是一个好主意。显然,这将是隐藏的,当它
我分配了一个直接缓冲区: ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); 我读过: Deallocating Direct Buf
场景。我有一个图表,我可以使用右键单击来执行平移。这非常有效。然后我完美地添加了右键菜单。 问题。现在,即使在拖动操作完成后释放鼠标,也会显示右键菜单。 有没有办法在 Java Swing 或 Jav
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片,因为内存分配/取消分配会导致堆大小增加/减少,从而导致性能下降。其
当我尝试释放缓冲区时遇到问题。每次我尝试将缓冲区传递给释放方法时,都会发生段错误。 Valgrind 确认段错误位于 BufferDeallocate 方法中。 ==30960== Memcheck,
我想知道何时按下或释放修改后的键(Ctrl 或 Shift)。 基本上,用户可以在按下修改键的情况下执行多次击键,而我不想在它被释放之前执行一个操作(想想 Emacs 和 Ctrl + X + S).
我编写了一个相当大的网络应用程序。它运行良好一段时间,然后慢慢开始运行缓慢,因为 DOM 节点开始爬升到 80,000 - 100,000 左右。 所以我一直在 Chrome 开发工具控制台 (DCT
我知道在像 c 这样的语言中,我需要在分配内存后释放它。 (我来自 Java),对此我有几个问题: 当我在做的时候: int array[30]; (即创建一个大小为 30 个整数的数组)与
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to release pointer from boost::shared_ptr? Detach
我有一个可以从多个后台线程访问的类,可能同时访问。我无法复制该类,因为重新创建它的内容(处理或内存方面)可能很昂贵。 也有可能在后台处理仍在继续并访问该属性时替换了此类的属性。 目前我有定期的保留/释
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
我有一个实例变量 NSMutableArray* searchResults。 首先,我初始化它: self.searchResults = [[NSMutableArray alloc] init]
如果我在堆上声明一些东西,比如 char *a=new char[1000] 并且主程序停止,如果没有 delete[]<,那么分配的内存会发生什么 调用?它保留在堆上还是自动释放? 最佳答案 就C+
在开发相机应用时,我遇到了一个异常,该异常仅在我切换到其他应用时发生(onPause() 用于我的应用)。 01-15 17:22:15.017: E/AndroidRuntime(14336): F
使用 JDK 1.8 编译时出现 maven 编译器错误 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (de
将 BufferedImage 保存到磁盘(以释放内存)的最快方法是什么? 我的 Java 应用程序处理大量图像(每约 300 毫秒将图像加载到内存中)。大多数这些图像都会立即被丢弃 (gc),但每隔
使用 JDK 1.8 编译时出现 maven 编译器错误 未能在项目 DUMMY 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:
我是一名优秀的程序员,十分优秀!