【问题标题】:CFString (immutable) memory usage keeps on growing in IOS applicationCFString(不可变)内存使用量在 IOS 应用程序中不断增长
【发布时间】:2023-03-19 03:45:01
【问题描述】:

我正在使用工具检查我的 IOS 应用程序的内存使用情况,发现 CFString 一直在分配和增长。在我的代码中创建 NSString 对象时,我使用了 StringWithFormat 方法,而不是 [[NSString alloc] init] 之类的方法。我怎样才能阻止这个? 下图是仪器输出的屏幕截图。

如果缺少问题的必要信息,请告诉我。

【问题讨论】:

  • 您可以尝试使用 ARC... 在任何情况下,您都可以在 Instruments 中浏览每个列出的对象(以及每个 eventq 的相关调用堆栈)的保留/释放事件,以帮助您追踪源的问题。最后,在 Xcode 中尝试分析构建样式,看看静态分配器是否指出任何潜在的保留/释放问题。
  • 请说明创建字符串的方法。
  • @Ryo 您的问题解决了吗?你为此做了什么?请告诉我。我也面临同样的问题。
  • @Pooja M. Bohora:你能找到解决办法吗?
  • @BaSha:我删除了 nsstring 的 stringwithformat 方法,因为它创建了自动释放字符串

标签: ios memory memory-management memory-leaks instruments


【解决方案1】:

如果您使用便利的构造函数创建大量临时对象,使用自定义自动释放池块是一个很好的做法。 由于使用便利构造函数创建的对象是自动释放的,因此它们可能不会立即释放。这就是内存使用量激增的原因。

来自Apple

许多程序会创建自动释放的临时对象。这些 对象添加到程序的内存占用,直到结束 堵塞。在许多情况下,允许临时对象堆积 直到当前事件循环迭代结束不会导致 过多的开销;但是,在某些情况下,您可以创建一个 大量增加内存的临时对象 足迹,并且您希望更快地处理。在这些 后一种情况,您可以创建自己的自动释放池块。在 在块的末尾,临时对象被释放,这通常 导致它们被释放,从而减少程序的内存 足迹。

http://www.cocoanetics.com/2009/08/understanding-autoreleasing/

【讨论】:

    【解决方案2】:

    在我们的例子中,我发现 NSStrings 的持续泄漏(其中许多属于 NSPlaceholderString 类,它是类集群的一部分)是由于 NSZombieEnabled 在方案中启用。

    关闭它可以消除这种内存泄漏源。

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 2012-01-11
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2013-10-20
      • 2016-02-24
      相关资源
      最近更新 更多