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

来源:互联网 发布:ubuntu 命令行解压deb 编辑:程序博客网 时间:2024/06/02 02:36

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方法时不自动进行声明。






0 0
原创粉丝点击