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
2.单个对象的内存管理分析
手动内存管理研究问题方法
1.野指针操作
2.内存泄漏
retainCount= 0
系统已经将p所指向的对象回收了
EXC_BAD_ACCESS 访问了不可访问的内存空间
被系统回收的对象我们称之为僵尸对象
默认情况下xcode为了提高编码效率,不会时时检查僵尸对象
如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
只要对象的retainCount != 0就会一直存在在内存中
内存泄漏指的就是,不再被使用的对象,一直在内存中没有被销毁
野指针操作,当一个对象retainCount已经为0 时,调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常
4.set方法的内存管理分析
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方法时不自动进行声明。
创建对象
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方法时不自动进行声明。
相关文章推荐
- OC视频笔记-键值编码的基本概念
- 黑马程序员---OC学习笔记之block的基本概念
- iOS笔记--oc语法7 (深、浅复制的基本概念)
- 黑马程序员——OC语言加强---内存管理的基本概念及范围
- 第05天OC语言(01):内存管理基本概念
- OC视频笔记-引用计数和对象所有权的基本概念
- 黑马程序员---OC学习笔记之protocol概念及基本使用
- Vega Prime自学笔记(1)基本概念
- linux笔记09(linux的基本概念)
- 孙鑫VC学习笔记:第十五讲 进程和线程基本概念
- [WCF 学习笔记] 1. 基本概念
- [WCF 学习笔记] 1. 基本概念
- IOStream系统学习笔记 IOStream基本概念
- 孙鑫VC学习笔记:第十五讲 (一) 进程和线程基本概念
- Programming ASP.NET 学习笔记(要点)第3章 控件:基本概念
- 优秀课件笔记之计算机的基本概念和分类
- OSPF学习笔记1-基本概念
- 学习笔记-PPP and PPPoE基本概念
- UML学习笔记1.基本概念
- 内存管理基本概念之:碎片研究