您的位置:首页 > 移动开发 > IOS开发

iOS内存管理小总结

2015-07-14 16:35 267 查看
1、引用计数机制通过可以递增递减的计数器来管理 内存。对象创建好之后,其保留计数至少为1。若保留计数为正,则对象继续存活。当保留计数降为0时,对象就被销毁了

2、在对象生命周期中,其余对象通过引用来保留或者释放此对象。保留与释放操作分别会递增及递减保留计数

3、使用ARC一定要记住,引用计数实际上还是要执行的,只不过保留与释放操作现在是由ARC自动为你添加。实际上,ARC在调用retain、release、autorelease、dealloc这些方法时,并不通过普通的Objective-C消息派发机制,而是直接调用底层C语言版本。这样做性能更好,因为保留及释放操作需要频繁执行,所以直接调用底层函数能节省很多CPU周期。比方说,ARC会调用与retain等价的底层函数objc_retain。这也是不能覆写retain、release、或autorelease的缘由,因为这些方法从来不会被直接调用。

4、使用ARC时必须遵循的方法名命名规则,若方法名以下列词语开头,则返回的对象归调用者所有:alloc、new、copy、mutableCopy。归调用者所有的意思是:调用上述四种方法的那段代码要负责释放方法所返回的对象

5、ARC也会处理局部变量与实力变量的内存管理,可以用以下修饰符来改变局部变量与实例变量的语义

__strong:默认语义,保留辞职。

__unsafe_unretained:不保留此值,这么做可能不安全,因为等到再次使用变量时,其对象可能已经回收了。

__weak:不保留此值,但是变量可以安全使用,因为如果系统把这个对象回收了,那么变量也会自动清空

__autoreleasing:把对象“按引用传递”给方法时,使用这个特殊的修饰符。此值在方法返回时自动释放

6、ARC总结:有了ARC之后,程序员就无须担心内存管理的问题了,使用ARC来编程,可省去类中的许多“样板代码”。ARC管理对象生命期的方法基本是:在合适的地方插入“保留”及“释放”操作,在ARC环境下,变量的内存管理语义可以通过修饰符指明,而原本则需要手工执行“保留”及“释放”操作。ARC只是负责管理Ojective-C对象的内存,尤其要注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease

7、dealloc方法的调用:在 dealloc 方法中,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的“键值观察(KVC)”或NSNotificationCenter等通知,不要做其他事情。如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源,这样的类要和其使用者约定:用完资源后必须调用close方法。执行异步任务的方法不应在dealloc里调用,只能在正常状态下执行的那些方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了

8、自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里。合理运用自动释放池,可降低应用程序的内存峰值。@autoreleasepool这种新式写法能创建出更为轻便的自动释放池

9、僵尸对象:系统在回收对象时,可以不将其真的回收,而是把它转化为僵尸对象,通过环境变量NSZombieEnabled可开启此功能。系统会修改对象的isa指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象,僵尸能够响应所有的选择子,响应方式为:打印一条包含消息内容及其接受者的消息,然后终止应用程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息