Objective c对象内存管理
1,管理范围> :任何继承了NSObject的对象,基本数据类型(int,char,float,double,struct,enum等)是不需要管理内存的。
2,引用计数器
> 每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,既有多少人正在使用这个OC对象
> 每个OC对象内部专门有4个字节的存储空间来存储引用计数器
> 当使用alloc,new或者copy创建一个新对象时,新对象的引用计数器默认就是1
> 当一个对象引用计数器值为0时,对象占用的内存就会被系统回收,换句话说,如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收,除非整个程序已经退出。
> 可以给对象发送retainCount消息获得当前的引用计数器值
> 给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)
> 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
> 给对象发送一条release消息,可以是引用计数器-1
> 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
> 一般会重写dealloc方法,在这里释放相关资源 ,dealloc就像对象的遗言
> 一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
一句话总结:谁retain,谁release
单对象管理
管理一个对象的内存,只需要return几次,就release几次就好了
多对象管理
难点主要在与多个之间有联系的对象的内存管理(对象组合)
遵循原则:当你想用一个对象的时候,你就给这个对象的引用计数器+1,当你不想用这个对象的时候,你必须給这个对象的引用计数器-1.
(1) ,类A包含类B,即某个对象B是对象A的成员变量,a为类A的一个对象,_b为a对象的一个成员变量,b为类B的一个对象。
当类B的一个对象b被创建好后,类A的对象a想拿来用,则调用set方法将对象b传给类A成员变量_b,此时对象a的set方法有责任对对象_b计数器+1,即在set方法里面对对象b进行一次retain操作
对象a对_b的计数器-1的情况有两钟,一种是对象a本身被销毁,第二种是对象a想换一个对象赋给_b。
第一种情况:对象a本身被销毁
> 则销毁对象a的dealloc方法有责任在销毁对象a的同时对对象_b计数器-1,即在dealloc方法里面进行一次release操作.
第二种情况:对象a想换一个对象赋给_b
> 则在对象a的set方法有责任对旧对象的计数器-1,即在set方法里面条件判断出来传进来的对象是否是旧对象,若是则不做任何操作,若不是则对旧对象进行一次release操作,并对新对象进行retain操作。
(2) ,set方法和dealloc方法代码示例Person类包含Car类
// set方法
- (void)setCar:(Car *)car
{
if (car != _car)
{
[_car release];
_car = [car teain];
}
}
// dealloc方法
-(void)dealloc
{
[_car release];
[super dealloc];
}
1020

被折叠的 条评论
为什么被折叠?



