objective-c - 内存管理、自动释放、永久堆的问题在 iOS 上有时是 250+ kb

标签 objective-c ios memory-management autorelease

我真的很担心这个问题,似乎我在 iOS 应用程序的内存管理方面遇到了严重问题。

情况如下:首先我加载表。当用户点击一个单元格时,它会呈现一个复杂的 View 。 View 最消耗内存的是它正在加载 20+ UIImage s 为 500x500。该 View 中还有另外两个选项卡,加载一个媒体列表(那些 UIImage s,但随后在一个表格中)和另一个简单表格。

当我返回到第一个 TableView 时,显然仍然在堆上分配了超过 250 kB。我知道这个观点很复杂,但没有理由让这么多内存保持活力。好吧,你猜怎么着,当我经常切换到 View 时,最终应用程序会耗尽内存并被杀死。

我试图解决的问题:

  • 修复所有分析问题,因此不再有泄漏。
  • 全部查看init s 再次用于释放,利用 autorelease在可能的情况。
  • 使用 Instruments -> Leaks 检查所有内存泄漏。在 6 次运行时,我得到的泄漏不超过 2 或 3 次。
  • 最后, Instruments -> Allocation,检查堆。这让我感到困扰,在两个标记的 heapshots 之间,我得到了 250+ kB 的差异。我已经使用详细 View 对其进行了研究。我无法理解它:当它指向我的一个方法/类时,我很确定其中的所有内容要么已发布,要么已自动发布。它还指向很多非我的(比如 QuartzCore )方法/类。

  • 另外,我不明白为什么autorelease不是自动发布。我的意思是,它有时看起来像是一个标记为自动释放的对象,但发布得太晚了。我还没有创建任何 NSAutoreleasePool s 我自己,那么是否有可能仅在运行时停止时才耗尽池?我怎样才能定期排空游泳池(即使它不是我的)。

    任何帮助是极大的赞赏。

    亲切的问候,

    莱德

    用于堆检查:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

    最佳答案

    您在使用 imageNamed加载您的图像 - 此方法会将所有图像缓存在内存中。试试 initWithContentsOfFile反而。

    不过要小心; initWithContentsOfFile:根本不会缓存,所以如果你对同一张图片经常使用这种方法,那么你应该使用 imageNamed: !

    关于objective-c - 内存管理、自动释放、永久堆的问题在 iOS 上有时是 250+ kb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898009/

    相关文章:

    ios - UIButton上的事件指示器

    ios - Swift/UITableView 将随机行插入到部分以发布 AdMob 广告

    C内存映射

    c++ - 0xC0000005 : Access violation after calling CopyMemory()

    linux - 刷新缓存和TLB不起作用: flush_cache_mm(mm)/flush_tlb_mm(mm)

    ios - 我应该使用哪个压缩库来在 Objective-C 中正确组装有效的 XLSX 文件?

    ios - 在游戏过程中修改 SKActions

    ios - 有什么好的方法可以防止 Objective-C 中特定代码段的递归?

    ios - 形状像 UIBezierPath 的 UIView?

    ios - UITouchUpInside 不调用委托(delegate)方法