黑马程序员技术交流社区
标题:
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