【问题标题】:How free memory immediately in iOS?如何在 iOS 中立即释放内存?
【发布时间】:2011-11-18 17:00:34
【问题描述】:

当您进行释放时,您不会立即删除内存。我使用了this code,我可以看到使用释放前后的内存,它没有改变。好的,过段时间会放出来的。

但是,在启动一个会使用大量内存的库之前,我该怎么做才能释放所有内存?或者如何立即释放内存?

【问题讨论】:

  • 我认为您误解了内存的工作原理。您的应用程序有一个为其保留的内存池,当您释放内存时,它会返回该池。如果您的程序需要释放的内存,它应该立即可用。
  • 驻留大小可能仅准确到整个页面,因此不应作为绝对指导。无论如何,您能否展示您的代码不会立即释放内存?相关对象可能由于某种原因最终进入自动释放池,例如因为您在某个时候使用了 getter 来获取它,即使您随后解除了父对象的所有权。
  • 一个很好的类比可能是,如果你正在使用一个工具,你完成设置它并宣布“我完成了这个”。下一个用户出现之前可能需要一两分钟,但这并不意味着它不可用。

标签: objective-c ios memory-management


【解决方案1】:

内存管理在 iOS 中是一件大事,但这些信息在我的开发过程中帮助了我很多。

“每个对象都有一个“保留计数”,通过调用“保留”来增加,通过调用“释放”来减少。一旦保留计数达到 0,对象就会被释放,内存可以用于其他用途。

您可以“自动释放”对象。这意味着保留计数不会立即减少,而是会在下一次当前自动释放池耗尽时减少。

iOS 应用程序有一个事件循环,您的代码在其中运行。在事件循环的每次迭代之后,自动释放池被耗尽。任何保留计数为 0 的对象都会被释放。

默认情况下,自动释放对象由不以 new、copy、mutableCopy、retain 或 init 开头的方法返回。这意味着您可以立即使用它们,但如果您不保留它们,则该对象将在运行循环的下一次迭代中消失。

如果你未能释放保留的对象但不再引用它们,那么你就会发生内存泄漏,这可以通过 Instruments 中的泄漏工具检测到。

一种策略是自动释放上述命名方法返回的所有内容,并将对象存储在保留属性中(或复制字符串)。在对象的 dealloc 方法中,将所有属性设置为 nil。将保留/复制属性设置为 nil 会释放它当前指向的对象。只要您没有任何循环引用(通过不为“父”对象(例如委托)使用保留属性来避免),您就永远不会遇到任何泄漏。”

这里是此信息的主题链接

http://www.quora.com/What-is-the-best-way-to-understand-memory-management-in-iOS-development

这是一个很好的线程,包含一些有用的代码示例以及其他参考资料。

【讨论】:

    【解决方案2】:

    Release 立即释放内存(假设它是最后一个版本)。这意味着,它可以在分配时再次被您的应用程序使用。 请注意,每个应用程序都有一些由系统分配的空闲内存块(页面),并且在分配/释放页面的一部分时,释放的内存不会自动返回给系统。它只是被标记为免费并且可以被应用程序再次使用。

    要了解这一切,您需要了解操作系统如何处理内存分配、虚拟内存等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多