iOS内存管理高级指南

    应用程序内存管理是:“程序运行时,开辟的内存空间。使用它,释放它”的过程,写的好的程序尽可能少使用内存。在Objective-C中,内存管理被看做是:“在很多数据、代码下,分配受限内存资源所有权方法”。当你依据这个指南完成你的程序时,你将获得“通过显式管理对象的命周期,不使用的时候释放他们,来管理程序内存”的知识。


    尽管,典型的内存管理是作用于单个对象,你的目标是通过管理对象图。你想确保:在内存中没有比实际需要的还多的对象。

ios内存管理面试 ios内存管理几种方法_ios内存管理面试

概述

Objective-C提供两种内存管理的方法:


1.”manual-release“(MRR),需要显式管理内存通过跟踪对象的所有权。MRR基于NSObject类在运行时提供的引用计数实现的。


2.”Automatic Reference Counting“ARC,系统使用相同的引用计数基于MRR,但是在编译时,为开发者适当插入一些内存管理方法。强烈建议开发者在新项目中使用ARC。使用ARC就无需理解本文所描述的内容了。

防止内存相关问题的好的做法

两个主要的内存管理误用问题


1.释放或覆盖正在使用的数据。


这将造成内存损坏,造成应用程序崩溃,或者更坏的情况是损坏用户数据。


2.没有释放数据,导致内存泄露。


泄漏导致应用程序的内存使用量逐渐增加,这反过来又可能会导致系统性能较差或者应用程序被终止(crash)



    引用计数内存管理的角度思考,但是,往往是适得其反,因为你往往会考虑内存管理方面的实现细则,而不是在你的实际目标。相反,你应该想到的内存管理对象所有权和对象图的角度。



    ● Cocoa使用简单的命名惯例来指示,是否拥有函数返回的对象。

点击查看内存管理策略


    ● 尽管内存管理基本策略很简单,有一些实际的步骤,你可以使内存管理更轻松,有助于确保你的程序仍然可靠和稳定的,而在同一时间最大限度地减少资源需求。

点击查看内存管理实践


    ● Autorelease pool 提供一种机制:让对象延迟release。这个对你想放弃所有权,但又想避免立即释放(比如函数的返回值)。有些时候,你可能会使用自己的autorelease池块,

 


使用分析工具来调试内存问题

在编译时候找出代码的问题。使用Xcode内嵌的Clang Static Analyzer 


如果内存管理的问题仍然发生,还有其他的工具和技术,你可以用它来识别和诊断问题。


    ● 多数工具和技术都在TN2239中有描述,iOS Debugging Magic 特别是NSZombie来帮助找到过度释放对象。