OC内存管理

__strong强引用
1、通过__strong或无标识的对象指针
2、内存被该类型对象指针使用时不会释放(即对象存在,强引用变量内存不会被释放)

__weak归零弱引用
内存被该类型对象指针是利用时,随时可能释放,内存释放后,使用该内存的对象指针被置为nil


__unsafe_unretained弱引用
内存随时释放,且对象指针不被置nil

autoreleasing自动释放类型对象
被该对象指针使用过或使用中的内存出自动释放池即释放,不论对象存在与否。通过与自动释放池配合和延迟或提前释放内存。

优先级:
__strong>autoreleasing>weak和unsafe

内存管理解决方案:
1、多个对象相互引用成链且闭环,可将其中一个设置为weak属性
2、for循环内部循环创建大量对象(非alloc方式创建),可在外部添加自动释放池


C: 谁申请谁释放
Java:垃圾回收机制,不再被使用的内存空间自动回收。
Objective-C:引用计数(手动、自动引用、自动释放等)和垃圾回收。



引用计数是实例对象的内存回收唯一参考

引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减一,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永不该手动调用对象的dealloc方法。

它的内存管理API老简单老简单了,下面就是它主要操作接口:

1,alloc, allocWithZone,new(带初始化)

为对象分配内存,retainCount为“1”,并返回此实例

2,retain
retainCount 加“1”

3,copy,mutableCopy
复制一个实例,retainCount数为“1”,返回此实例。所得到的对象是与其它上下文无关的,独立的对象(干净对象)。

4,release
retainCount 减“1”,减到“0”时调用此对象的dealloc方法

5,autorelease
在当前上下文的AutoreleasePool栈顶的autoreleasePool实例添加此对象,由于它的引入使Objective-C(非GC管理环境)由全手动内存管理上升到半自动化。

Objective-C内存管理准则

我们可以把上面的接口按对retainCount的操作性质归为两类,
A类是加一操作:1,2,3
B类是减一操作:4,5(延时释放)

内存管理准则如下:
1,A与B类的调用次数保持一制
2,为了很好的保障准则一,以实例对象为单位,谁A了就谁B,没有第二者参与

例:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *o = [[NSObject alloc] init];     //retainCount为1
[o retain];     //retainCount为2
[o release];  //retainCount为1
[o autorelease];  //retainCount为1
[pool release];  //retaincount为0,触发dealloc方法


 对象所有权
内存管理模型是基于对象所有权的。拥有对象所有权就表示你需要保持该对象存在,可以通过retain来获取对象所有权。
两种情况需要使用retain
1.在setter方法和init方法中,将一个对象作为属性来使用
2.为了避免其它操作是对象变成无效对象
不再需要一个对象,必须释放该对象所有权。 不拥有的对象,不能释放该对象所有权。
基本原则:如果使用new、alloc、copy、或mutableCopy方法获得一个对象,必须释放或自动释放该对象。(release、autorelease)
autorelease延后释放:使用autorelease声明愿意放弃对象所有权,但容许调用的方法继续使用该对象直到被自动释放池清理。


dealloc方法:当对象没有拥有者并且内存要被回收时系统会自动调用dealloc方法,释放对象自己的内存,释放所有它控制的资源,包括释放所有实例变量的所有权。
1.不能直接调用另一个对象的dealloc方法
2.在dealloc方法实现的最后要调用父类dealloc方法
3.应用结束时,系统未必会调用对象的dealloc方法

防止正在使用的对象失效:retain所需要的使用的对象,并在使用完之后清理它
集合与对象所有权:将一个对象加入到集合中时,集合会拥有该对象的所有权;当集合移除该对象,或者集合本身被清理时,集合会放弃对象的所有权。

属性与内存管理:

不要在初始化和dealloc中使用setter方法。P135

自动释放池块:@autoreleasepool内存较大时,运行完毕自动释放


申请:alloc/new
获取所有权:retain/copy
释放:release

采用ARC实现内存管理:自动引用计数技术
无人使用的指针立即释放
强引用对象不会释放,归零弱引用不保证内存存在,但不会成野指针


























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值