1

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

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

2) 我是否应该使用 Leaks 以外的其他工具来确定我的应用程序是否能很好地管理内存?

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

4)究竟什么是malloc?

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

谢谢!

4

3 回答 3

3

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

  • 考虑到它正在运行的任何数据,它似乎在合理数量的内存中运行,还是它使用的内存比您预期的要多得多?

  • 当程序不做任何事情时,它的内存使用是否合理且稳定?

  • 如果您彻底地运行程序,内存使用量是否稳定或似乎无限制地增长?

  • 您的程序是否对来自操作系统的内存警告做出适当响应?

  • 它是否能优雅地容忍低内存条件?

我是否应该使用 Leaks 以外的其他工具来确定我的应用程序是否能很好地管理内存?

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

随着我继续运行我的应用程序,我的实时字节数不断增长。

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

究竟什么是malloc?

malloc()是 C 标准库中的内存分配函数之一。我感觉你在问,因为你在 Allocations 工具的 Category 列中看到像Malloc 16 bytes这样的行:

来自 Instruments 的插图

这些行表示由 分配的一类内存块malloc()。如您所见,在我的情况下malloc(),我的程序中当前正在使用 3318 个 16 字节块。确切的数字并不那么重要——您关心的是该数字如何随时间变化。如果您发现malloc()每次执行某些操作时都使用了一些块并且从未释放,那么您将知道在程序中的何处查找内存问题。(当然,任何其他类型的块也是如此。)

于 2012-07-19T01:48:14.937 回答
2
  1. 您如何知道您的应用程序何时有效且正确地管理内存?当您没有泄漏并且您的内存大小不会增长时,您就会知道这一点,除非有原因。Apple 发布了许多信息丰富的视频,例如WWDC 2012 “iOS App Performance: Memory”和WWDC 2010 “Advanced Memory Analysis with Instruments”。

  2. 泄漏将帮助您找到无法访问的内存:您的程序无法再访问它。它不会帮助您找到可访问但无用的内存:无限制增长的缓存,或者不断获取隐藏旧子视图的新子视图的视图。随着时间的推移,您可以使用分配工具查看分配内存的内容。基本技术是单击“标记堆”,执行一些您认为应该导致分配的净零变化的操作(在您的应用程序中),然后再次标记堆并查看应该释放的新内容。同样,Apple 有视频更详细地解释了这一点。

  3. 见#2。

  4. stackoverflow 上已经有解决此问题的答案,例如:

malloc() 是如何在内部实现的?
malloc() 和 free() 是如何工作的?
free 和 malloc 在 C 中是如何工作的?

和网页,例如:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation
http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

于 2012-07-19T00:34:22.633 回答
1

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

2) 当然。Zombies、Allocations 甚至 Time Profiler 都可以帮助您管理对象生命周期。

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

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

于 2012-07-19T00:34:31.280 回答