码迷,mamicode.com
首页 > 其他好文 > 详细

关情纸尾-----内存管理

时间:2015-05-30 21:11:50      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

一、引用计数器

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!