黑马程序员技术交流社区

标题: OC--内存管理 [打印本页]

作者: gmx1120    时间: 2015-7-6 21:19
标题: OC--内存管理
OC内存管理

一、基本原理

(一)为什么要进行内存管理。

由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。

本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。



(二)对象的基本结构

每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。



(三)引用计数器的作用

判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。



(四)操作

给对象发送消息,进行相应的计数器操作。

Retain消息:使计数器+1,改方法返回对象本身

Release消息:使计数器-1(并不代表释放对象)

retainCount消息:获得对象当前的引用计数器值



(五) 对象的销毁

当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。

当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。

一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
作者: 涛涛    时间: 2015-7-6 21:23
好的呀!!!已收
作者: 4B青年    时间: 2015-7-6 22:27
楼主有心了,收藏下
作者: peng_gavin    时间: 2015-7-7 07:34
大赞楼主,OC的内存管理也是重点呢
作者: 984326157    时间: 2015-7-7 09:53
总结的不错,顶一个
作者: Crisps    时间: 2015-7-7 16:16
引用计数器:每个对象都有一个“引用计数器”,占4个字节。表示有多少人在占用对象。
当使用alloc.new.copy创建新对象时,计数器默认为1.
僵尸对象:当计数器为0时,对象占用的内存就会被系统回收,成为僵尸对象。
野指针:指向僵尸对象的指针。给野指针发送消息就会报错。
空指针:p=nil没有指向任何对象的指针,给空指针发送任何消息都不会抱错。
retain:给对象发送retain消息,计数器➕1,方法返回对象本身
release:给对象发送release消息,计数器➖1。
retainCount:给对象发送retainCount消息,返回计数器值。
当对象被销毁时,系统自动向对象发送dealloc消息,一般重写dealloc消息,就像交待遗言,重写时最后要[super dealloc]

一旦对象被回收,它所占用的内存就不可用,坚持使用,会导致程序崩溃,野指针错误EXC_BAD_ACCESS
作者: zilin    时间: 2015-7-7 22:42
受教了。
作者: 984326157    时间: 2015-7-8 10:12
不错,赞一个
作者: zlc    时间: 2015-7-8 10:49
赞赞赞!!:lol
作者: unnamed    时间: 2015-7-8 10:55
总结的不错!复习了。
作者: 4B青年    时间: 2015-7-8 22:11
总结的不错,已收藏。。。
作者: 4B青年    时间: 2015-7-8 22:12
Crisps 发表于 2015-7-7 16:16
引用计数器:每个对象都有一个“引用计数器”,占4个字节。表示有多少人在占用对象。
当使用alloc.new.copy ...

好厉害,补充的不错哦
作者: 弥修斯    时间: 2015-7-8 22:27
收藏…………
作者: Dove丶凡    时间: 2015-7-8 22:43
身为你的同学。我很高兴受教了
作者: 小小羊    时间: 2015-7-8 23:12
楼主辛苦了,总结的都有用
作者: 弹剑    时间: 2015-7-8 23:32
厉害厉害,学习了

作者: 毛琳东    时间: 2015-7-8 23:37
你这跑的好快啊 彩开始讲OC啊   来点C语言的
作者: 深蓝的蓝    时间: 2015-7-9 00:35
楼主辛苦,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2