标签:
一、引用计数器
1.整数,4个字节,表示对象被利用的次数
2.创建一个新对象时,新对象的引用计数器默认为1
3.当某个对象的引用计数器为10时,所占内存被系统回收
4.引用计数器的操作
return +1
release -1
retainCount 获得当前引用计数器值
5.对象的销毁
①引用计数器 0
②系统自动发送dealloc给对象
③重写dealloc方法
④一旦重写了dealloc,就必须调用[super dealloc],放在最后面调用
⑤一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致系统崩溃(也就是野指针错误)
二、野指针和空指针
1.僵尸对象:对象被回收,僵尸对象不能复活,即不能复活,也就是不能再用 retain 了。如果这个指针还需要用,要么赋新值,要么给个nil
2.野指针:指向僵尸对象或者不可用内存
3.空指针:null,nil,0.在oc中不存在空指针错误,系统只会发出警告,不报错
注:如果给已经释放的对象发送一条消息,可能导致程序闪退
三、set方法的内存管理
1.内存管理代码规范
(1)只要调用了dealloc,必须有release
(2)set方法的代码规范
①基本数据类型:直接复制
-(void)setAge:(int)age
{
_age = age;
}
②oc对象类型
-(void)setCar:(Car*)car
{
if(car!=_car) //先判断是不是新传递进来的对象
{
[_car release]; // 对旧对象做一次release
_car = [car retain]; //对新对象做一次retain
}
}
2.dealloc方法的代码规范
(1)一定要[super dealloc],并且放到最后
(2)对self(当前)所拥有的其他对象做一次release
-(void)dealloc
{[_car release];
[super dealloc];
}
四、property的内存管理(代替oc对象的set方法,省略get方法)
@property(retain)Book*book;
相当于省略了,
-(void)setBook:(Book*)book
{
if(_book!= book)
{
[_book release];
_book = [book retain];
}
}
五、参数分类
1.内存管理相关参数
①retain:release旧值,retain新值(适用于oc对象类型)
②assign:直接赋值(默认适用于非oc对象类型)
③copy:release旧值,copy新值
④strong:一般对象
2.是否要生成set方法
①readwrite:同时生成setter和getter的声明,实现(默认)
②readonly:只会生成getter的声明和实现
3.多线程管理
①nonatomic:性能高
②atomic:性能低(默认)
4.setter和getter方法的名称(自定义)
setter:决定了set方法的名称,一定要有个冒号
getter:决定了get方法的名称
六、autorelease的基本使用
1.返回值是id,即对象本身
2.将对象一个自动释放池,当自动释放池(也是一个对象)被销毁时,会对池中所有对象做一次release操作,但是池子被销毁,对象不一定被销毁
3.不再用担心僵尸对象
4.创建的释放池以栈的方式存储,即先进后出
5.调用完autorelease后,对象的计数器不变
6.不用关心对象释放时间
7一般对占用内存较小的对象使用
七、ARC基本原理
1.ARC的特点
①不允许调用release、retain、retainCount
②允许重写dealloc,但是不允许[super dealloc]
③@property
☆strong:相当于retain(oc对象类型,强指针)
☆weak:相当于assign(oc对象类型,弱指针)
☆assign:适用于非oc对象类型
2.ARC的判断准则:只要没有强指针指向对象,就会释放对象
强指针:系统默认都是。_strong
弱指针: _weak
标签:
原文地址:http://www.cnblogs.com/Lorraine1/p/4540947.html