我有一些关于内存管理的问题。我正在使用ARC,xcode 4.2.1,部署到ios 5.0 +
1)您如何知道您的应用何时有效且正确地管理内存?如果它没有泄漏记忆,正如您在仪器泄漏工具中测量的那样,那么您的应用程序是否完全健康?
2)我是否应该使用Leaks之外的其他工具来确定我的应用程序是否管理好内存?
3)当我继续运行我的应用程序时,我的实时字节不断增长。我的应用程序有一个UITableView显示一些数据。当用户单击某行时,我会将它们带到更详细的页面。如果这是我的应用程序正在做的,为什么我的实时字节会继续增长?不应该释放所有对象,将我的实时字节降低到我第一次启动应用程序时的状态吗?
4)malloc究竟是什么?
我即将完成申请,我只想知道如何衡量该应用是否可以发布,以及如何识别任何问题。
谢谢!
答案 0 :(得分:3)
您如何知道您的应用何时有效且正确地管理内存?
根据它运行的数据,它是否在合理的内存中运行,还是使用了比预期更多的内存?
当程序没有做任何事情时,它的内存使用是否合理且稳定?
如果你彻底运用这个程序,内存使用是否稳定,或者它似乎无限制地增长?
您的程序是否对操作系统的内存警告做出了适当的响应?
它是否能够优雅地容忍低内存条件?
我是否应该使用除Leaks之外的其他工具来确定我的应用程序 管理记忆力好吗?
Instruments中的各种工具应足以帮助您了解应用程序如何使用内存。您可能要考虑做的一件事是保存仪器会话的结果以及一些注释,以便您可以看到应用程序的内存使用情况随时间的变化。
随着我继续运行我的应用,我的实时字节不断增长。
这可能是也可能不是问题;它有助于了解不断添加的块中的内容。如果设备上有可用的内存,使用它没有任何问题,特别是如果它意味着你的应用程序表现更好,可以避免从某些来源下载类似的数据,等等。但是如果你的应用程序一直在分配新的视图控制器和视图而不释放旧的,这可能是泄密。
malloc究竟是什么?
malloc()
是C标准库中的内存分配函数之一。我有一种感觉,你问的是因为你在Allocations工具的Category栏中看到 Malloc 16 bytes 这样的行:
这些行表示由malloc()
分配的一类内存块。如您所见,在我的情况下,我的程序中正在使用来自malloc()
的3318个16字节块。确切的数字并不那么重要 - 你关心的是这个数字随时间变化的方式。如果您发现使用了一些malloc()
块,并且每次执行某些操作时都不会释放,那么您将了解在程序中查找内存问题的位置。 (当然,任何其他类型的块都是如此。)
答案 1 :(得分:2)
您如何知道您的应用何时有效且正确地管理内存?当你没有泄漏并且你的内存大小没有增长时你知道它,除非有理由。 Apple发布了许多信息性视频,例如WWDC 2012“iOS应用程序性能:内存”和WWDC 2010“使用仪器进行高级内存分析”。
泄漏会帮助您找到无法访问的内存:您的程序无法再访问它。它不会帮助您找到可以访问但无用的内存:不受限制地增长的缓存,或者不断获取隐藏旧子视图的新子视图的视图。您可以使用Allocations工具查看随着时间的推移分配内存的内容。基本技术是单击“标记堆”,执行一些操作(在您的应用程序中),您认为应该导致分配中的净零更改,然后再次标记堆并查看应该释放的新内容。 Apple再次提供了更详细解释此内容的视频。
见#2。
stackoverflow上已有解决此问题的答案,例如:
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 :(得分:1)
1)这取决于您的应用程序的功能。如果您正在运行一个执行简单任务的简单应用程序,那么高效的内存使用并不是什么大问题。您更专注于编写一个裸机和内存啜饮的应用程序。但是,如果你的项目需要肌肉,或进行强烈的计算,那么内存优化完全集中在削减边缘的脂肪。
2)当然。 Zombies,Allocations甚至Time Profiler都可以帮助您管理对象生命周期。
3)您的应用程序实际上应该使用您描述的内存量越来越大。您似乎期望导航堆栈在堆栈上释放视图控制器,这与导航堆栈存在的原因完全相反。当您将更多视图控制器推入堆栈时,内存使用量会增加,因为现在有一个新的视图控制器需要管理。如果你的应用程序正在删除大部分内存,那就要担心了,因为那时你会遇到僵尸对象的主要问题。
4)malloc是alloc的C版本。唯一的区别是alloc执行一些运行时魔术并设置类'isa指针并在最终调用malloc之前调整一些次要的每个对象值。 Malloc分配一块内存,并返回指向该对象的指针。这就是为什么你只分配对象而不是基元(注意可以指向基元,然后确实需要malloc),因为你需要一个有效的指针,它本身就是一块内存。