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

OC笔记 - 手动内存管理的基本概念(2015.1.30)

2015-02-06 20:16 253 查看
1.手动内存管理基本概念

创建对象
 1.分配内存空间,存储对象
 2.初始化成员变量
 3.反回对象的指针地址

 
1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象
2.[对象 release]  reatinCount - 1
3.[对象 retain]   reatinCount + 1 ,返回self
4.我们的引用计数retainCount = 0的 对象就被销毁了
5.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象你将要被销毁
 

内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease

<span style="font-size:18px;">-(void)dealloc
{
//在对象自身被销毁之前,一定要先调用[super dealloc]释放父类中的相关对象
[super dealloc];
NSLog(@"Person 被销毁了");
}
</span>


2.单个对象的内存管理分析
手动内存管理研究问题方法
1.野指针操作
2.内存泄漏

retainCount= 0
系统已经将p所指向的对象回收了
EXC_BAD_ACCESS 访问了不可访问的内存空间
被系统回收的对象我们称之为僵尸对象
默认情况下xcode为了提高编码效率,不会时时检查僵尸对象

 

如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil

 

只要对象的retainCount != 0就会一直存在在内存中
内存泄漏指的就是,不再被使用的对象,一直在内存中没有被销毁
野指针操作,当一个对象retainCount已经为0 时,调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常

4.set方法的内存管理分析

<span style="font-size:18px;">- (void)setCar:(Car *)car
{

if (_car != car) //判断是否为原来的对象,若是则无需“去旧换新”
{   //c1 0
//relese旧值
[_car release];//[nil release];
//c2 2
//retain新值
_car  = [car retain];
}
</span>


5.@property参数

1.生产get与set方法的声明
2.生成get与set方法的简单实现
3.若果你没有声成名相对象的成员变量,那么他会自动生成一个_开头的成员变量
 
@property 参数分为4类
1.与set方法内存管理相关参数
retain: 要生成符合内存管理原则的set方法(应用与对象类型)
assign: 直接赋值,(对象类型,基本数据类型)
copy :  (后面讲解)
 
2.多线程相关
nonatomic: 不生成多线程线管代码,使用这个就可以了(效率高一点)
atomic:生成多线程线管代码(不写默认是这种方式)
实际开发中,只要是对象类型的@property都写成下面
 
3.是否要生成set与get方法
readwrite: 可读可写属性,同时生成set与get方法
readonly : 只读属性,只生成get方法
 
4.set与get方法名称相关的参数
setter:设置生成的set方法名称
getter:设置生成的get方法名称
 

如果一个对象被生成成了成员变量或者是使用@property生成的符合内存管理的set方法,那么一定要在 dealloc函数对应一次release操作

 

注意:@property会自动声明带下划线的变量,但当同时重写setter和getter方法时不自动进行声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息