首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS内存管理工具

iOS内存管理工具
EN

Stack Overflow用户
提问于 2012-07-19 08:19:48
回答 3查看 3.1K关注 0票数 1

我有几个关于内存管理的问题。我正在使用ARC,Xcode4.2.1,部署到ios 5.0+

1)如何知道您的应用程序何时有效且正确地管理内存?如果不是内存泄漏,正如你在instruments leaks工具中测量的那样,那么你的应用程序是完全健康的吗?

2)我是否应该使用其他工具而不是泄漏来确定我的应用程序是否管理好内存?

3)随着我继续运行我的应用程序,我的活动字节数也在不断增长。我的应用程序有一个显示一些数据的UITableView。当用户单击一行时,我会将他们带到一个更详细的页面。如果这就是我的应用程序正在做的所有事情,为什么我的活动字节数继续增长?难道不应该释放所有的对象,将我的活动字节减少到我第一次启动应用程序时的状态吗?

4) malloc到底是什么?

我即将完成该应用程序,我只想知道如何衡量该应用程序是否可发布,以及如何识别任何问题。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-19 09:48:15

您如何知道您的应用程序何时有效且正确地管理内存?

  • 在给定操作数据的情况下,它是否似乎在合理的内存中运行,或者它使用的内存是否比您预期的多得多?
  • 当程序不执行任何操作时,它的内存使用是否合理和稳定?
  • 如果您彻底执行程序,内存使用是稳定的,还是看起来不受限制地增长?
  • 您的程序是否对来自操作系统的内存警告做出适当的响应?
  • 它是否优雅地容忍低内存条件?

我是否应该使用泄漏以外的其他工具来确定我的应用程序是否管理得很好?

Instruments中的各种工具应该足以帮助您查看应用程序是如何使用内存的。您可能要考虑做的一件事是保存Instruments会话的结果以及一些注释,以便您可以看到应用程序的内存使用随时间的变化。

随着我继续运行我的应用程序,

我的活动字节数保持增长。

这可能是问题,也可能不是问题;了解不断添加的块中的内容会有所帮助。如果设备上有可用的内存,使用它没有什么问题,特别是如果这意味着你的应用程序性能更好,可以避免从某些来源下载类似的数据,等等。但如果你的应用程序一直分配新的视图控制器和视图,而不释放旧的,这可能是一个漏洞。

到底什么是malloc?

malloc()是C标准库中的内存分配函数之一。我有一种感觉,您之所以这样问,是因为您在分配工具的Category列中看到了类似于Malloc 16字节的代码行:

这些行表示由malloc()分配的内存块的类别。如您所见,在我的例子中,我的程序中当前使用的是来自malloc()的3318个16字节块。确切的数字并不那么重要--您关心的是这个数字如何随着时间的推移而变化。如果您发现每次执行某个操作时都会使用一定数量的malloc()块,并且从未释放这些块,那么您就有了在程序中查找内存问题的线索。(当然,任何其他类型的块也是如此。)

票数 3
EN

Stack Overflow用户

发布于 2012-07-19 08:34:23

  1. 如何知道您的应用程序何时有效且正确地管理内存?你知道,当你没有泄漏,你的内存大小不会增长,除非有原因。苹果公司发布了一系列内容丰富的视频,如WWDC 2012“iOS应用程序性能:内存”和WWDC 2010“使用Instruments”.
  2. Leaks的高级内存分析将帮助您找到无法访问的内存:您的程序再也无法访问它了。它不会帮助您找到可访问但无用的内存:无限制增长的缓存,或不断获取隐藏旧子视图的新子视图的视图。您可以使用分配工具来查看随着时间的推移分配的内存是什么。基本技术是单击“mark heap”,执行一些您认为应该导致分配净零更改的操作(在您的应用程序中),然后再次标记堆,并查看应该释放的新内容。同样,苹果也有更详细地解释这一点的视频。
  3. 参见#2.
  4. 已经有解决这个问题的答案,例如:

How is malloc() implemented internally?

How do malloc() and free() work?

How do free and malloc work in C?

和网页,如下所示:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

票数 2
EN

Stack Overflow用户

发布于 2012-07-19 08:34:31

1)这取决于你的应用程序做什么。如果您正在运行一个执行简单任务的简单应用程序,那么高效的内存使用并不是什么大问题。您将更专注于编写一个简单且占用内存的应用程序。但是,如果您的项目需要肌肉,或者执行密集的计算,那么内存优化完全专注于修剪边缘周围的脂肪。

2)当然。僵尸、分配,甚至Time Profiler都可以帮助您管理对象的生命周期。

3)根据您的描述,您的应用程序实际上应该使用越来越多的内存。您似乎期望导航堆栈在堆栈的更高位置释放视图控制器,这与导航堆栈存在的原因完全相反。当您将更多的视图控制器放到堆栈上时,内存使用量会增加,因为现在有了一个新的视图控制器需要管理。如果你的应用程序删除了很大一部分内存,这将是你要担心的事情,因为那样你就会在僵尸对象上遇到严重的问题。

4) malloc是alloc的C版本。唯一不同的是,alloc执行了一些运行时魔术,设置了类的isa指针,并在最终调用malloc之前调整了一些次要的每个对象的值。Malloc分配一个内存块,并返回一个指向该对象的指针。这就是为什么你只分配对象,而不分配原语(注意,原语可以指向,然后需要malloc),因为你需要一个有效的指针,它本身就是一个内存块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11552255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档