手动管理内存的知识点整理

学习iOS开发,也有快半年了,经过向大虾们的取经,愈发的感觉到学习管理内存的重要性。apple虽然给我们提供了好用的ARC机制,但要想真正用好ARC还要“知其所以然”——学会手动管理内存。


有位大虾曾对我说过,手动管理内存的知识,面试时99%会考到。
下面开始是我的学习笔记。


-------------------------------------------我是华丽的分割线-------------------------------------------


一、手动管理内存的基本概念
(一)创建对象实际上分为三个步骤
1.分配内存空间,存储对象
2.初始化成员变量
3.反回对象的指针地址
(二)琐碎的小玩意
1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象
2.[对象 release]  reatinCount - 1
3.[对象 retain]   reatinCount + 1 ,返回self
4.我们的引用计数retainCount = 0的 对象就被销毁了
5.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象你将要被销毁,重写dealloc方法时,一定不要忘了调用父类的dealloc方法
6.内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease


二、单个对象的内存管理分析
1.内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease
2.手动内存管理主要研究两个问题:
    1.野指针操作
    2.内存泄漏
3.当retainCount = 0时,系统已经将p所指向的对象回收了,错误“EXC_BAD_ACCESS”,表示访问了不可访问的内存空间,被系统回收的对象我们称之为僵尸对象.默认情况下xcode为了提高编码效率,不会时时检查僵尸对象.让Xcode检测僵尸对象的方法是在调试项目菜单里选择Edit Scheme->run->Memory Management->Objective—C->Enable Zombie Objects项选中。(如果你调的项目比较大,类和对象比较多,千万不要选择实时检测僵尸对象,不然编译时间会长得痛不欲生)
4.如果你确定当前作用于中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
5.只要对象的retainCount != 0 就会一直存在在内存中
6.内存泄漏指的就是,不再被使用的对象,一直在内存中没有被销毁
7.野指针操作,当一个对象retainCount已经为0 时,调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常


三、手动内存管理类的相互引用问题
如果你的程序出现相互引用问题,那么一端要改成assign方式,不能够使用retain(回导致内存泄漏问题)


四、@property参数
(一)@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方法名称




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值