您的位置:首页 > 移动开发 > Objective-C

《Objective-C基础教程》第9章 内存管理(未完)

2015-08-13 11:28 330 查看
不要使用任何刚释放的内存,否则可能误用陈旧的数据或者破坏内存内的新数据,从而引发各种错误

9.1 对象的生命周期

对象的生命周期包括

1、 诞生(通过alloc、new或copy方法实现,copy表示接受到消息的对象会创建一个自身的副本),此时,保留计数器值为1,要增加可发送retain消息;减少可发送release消息,要获取保留计数器当前的值,可以发送

2、 生存(接受消息并执行操作)

3、 交友(通过复合以及向方法传递参数)

4、 死亡(被释放掉),保留计数器归0,Objective-C会自动向对象发送一条dealloc消息(可以重写dealloc方法,这样就能释放掉已经分配的全部相关资源,但一定不要直接调用,Objective-C会自动调用)

当生命周期结束时,他们的原材料(内存将被回收以供新的对象使用)

9.1.1 引用计数(reference counting),也叫做保留计数(retain counting)

引用计数器(保留计数器):每个对象都有一个与之相关的整数,当某段代码需要访问一个对象时,该代码就将该对象的保留计数器值加1,表示“我要访问该对象”;反之,则减1,表示不再访问该对象。当保留计数器值为0时,表示不再有代码访问该对象,它将被销毁

9.1.2 对象所有权

当我们说某个实体“拥有一个对象时”,就意味这该实体要负责确保对其拥有的对象进行清理。对象所有权影响内存的释放

9.1.3 访问方法中的保留和释放

9.1.4 自动释放

9.1.5 所有对象放入池中

自动释放池(autorelease pool)

9.1.6 自动释放池的销毁时间

两种方法可以创建一个自动释放池:

1、 通过@autoreleasepool关键字(推荐使用)

使用@autorelease{}时,任何在花括号里定义的变量在花括号外无法使用

2、 通过NSAutoreleasePool对象

NSAutoreleasePool *pool=[NSAutoreleasePool new];



[pool release];//释放该池

9.1.7 自动释放池的工作流程

9.2 Cocoa的内存管理规则(如果使用new、alloc或copy方法创建一个对象,就释放或自动释放该对象)

1、 当使用new、alloc或copy方法创建一个对象时,对象的保留计数器数值为1。当不再使用该对象时,应该向该多想发送release或autorelease消息,销毁对象

2、 当通过其他方法获得一个对象时,假设该对象的宝库计数器的值为1,而且已经被设置为自动释放,则不需要执行任何操作来确保该对象得到清理。如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它

3、 如果保留了某个对象,就需要(最终)释放或自动释放该对象。必须保持retain和release方法的使用次数相等

9.2.1 临时对象(不打算长期拥有的对象)

获取途径 临时对象 拥有对象

alloc\new\copy 不再使用时释放 在deallco中释放

其他方法 不需任何操作 获得对象时保留,在deallco中释放

9.2.2 拥有对象

9.2.3 垃圾回收(自动内存管理机制,只支持OS X应用开发)

9.2.4 自动引用计数(automatic reference counting,ARC)

iOS中无法使用垃圾回收的主要原因时无法知道垃圾回收器什么时候会起作用。

苹果

1、 有时用weak会好一些

当指针志向某个对象时,如果管理它的内存(通过retain和release),就拥有这个对象的强引用(strong reference),不管理,拥有弱引用。

使用弱引用,有助于处理保留循环(retain cycle):2个强引用会使超类的保留计数器加2,当不需要超类,向其发送release时,保留计数器的值为1,造成内存泄漏。

2、 一辆新车

Xcode可以将已有的项目转换为支持ARC的。但必须禁用垃圾回收机制。

3、 拥有者权限

为了便于ARC工作,必须告诉编译器哪个对象时指针的拥有者

9.3 异常

支持一场特性,需要在Xcode中启用Enable Objective—C Exceptions项

9.3.1 与异常有关的关键字

@try:

@catch():

@finally:

@throw:

9.4 小结

1、 Cocoa内存管理方法:retain、release和autorelease

2、 垃圾回收和自动引用计数(ARC)

3、 保留计数器

4、 当对象接收到autorelease时,保留计数器的值不改变,该对象被放入NSAutoreleasePool中,等待自动释放池销毁

5、 Cocoa内存管理的三个规则
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: