A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gmx1120 中级黑马   /  2015-7-6 21:19  /  1296 人查看  /  18 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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-8 23:46

18 个回复

倒序浏览
好的呀!!!已收
回复 使用道具 举报
楼主有心了,收藏下
回复 使用道具 举报
大赞楼主,OC的内存管理也是重点呢
回复 使用道具 举报
总结的不错,顶一个
回复 使用道具 举报
引用计数器:每个对象都有一个“引用计数器”,占4个字节。表示有多少人在占用对象。
当使用alloc.new.copy创建新对象时,计数器默认为1.
僵尸对象:当计数器为0时,对象占用的内存就会被系统回收,成为僵尸对象。
野指针:指向僵尸对象的指针。给野指针发送消息就会报错。
空指针:p=nil没有指向任何对象的指针,给空指针发送任何消息都不会抱错。
retain:给对象发送retain消息,计数器➕1,方法返回对象本身
release:给对象发送release消息,计数器➖1。
retainCount:给对象发送retainCount消息,返回计数器值。
当对象被销毁时,系统自动向对象发送dealloc消息,一般重写dealloc消息,就像交待遗言,重写时最后要[super dealloc]

一旦对象被回收,它所占用的内存就不可用,坚持使用,会导致程序崩溃,野指针错误EXC_BAD_ACCESS
回复 使用道具 举报
受教了。
回复 使用道具 举报
不错,赞一个
回复 使用道具 举报
zlc 中级黑马 2015-7-8 10:49:56
9#
赞赞赞!!:lol
回复 使用道具 举报
总结的不错!复习了。
回复 使用道具 举报
总结的不错,已收藏。。。
回复 使用道具 举报
Crisps 发表于 2015-7-7 16:16
引用计数器:每个对象都有一个“引用计数器”,占4个字节。表示有多少人在占用对象。
当使用alloc.new.copy ...

好厉害,补充的不错哦
回复 使用道具 举报
收藏…………
回复 使用道具 举报
身为你的同学。我很高兴受教了
回复 使用道具 举报
楼主辛苦了,总结的都有用
回复 使用道具 举报
厉害厉害,学习了
回复 使用道具 举报
你这跑的好快啊 彩开始讲OC啊   来点C语言的
回复 使用道具 举报
楼主辛苦,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马