内存管理基础
来源:互联网 发布:.market域名 编辑:程序博客网 时间:2024/06/07 05:29
</pre><table cellspacing="0" cellpadding="0" id="blogContentTable" style="margin:0px; padding:0px; border-collapse:collapse; border-spacing:0px; color:rgb(68,68,68); font-family:punctuation,微软雅黑,Tohoma; font-size:12px; line-height:19.2000007629395px; table-layout:fixed; width:880px; position:relative"><tbody style="margin:0px; padding:0px"><tr style="margin:0px; padding:0px"><td valign="top" style="margin:0px; padding:0px; word-wrap:break-word"><div id="blogContainer" style="margin:0px; padding:0px; position:relative; overflow:hidden; height:1232px"><div id="paperTitleArea" align="center" style="margin:0px; padding:0px"><span id="paperTitle" style="margin:0px; padding:0px; display:block; word-break:break-all"></span></div><div id="blogDetailDiv" style="margin:0px; padding:0px; min-height:380px; font-size:14px"><div class="blog_details_20120222" style="margin:0px; padding:0px"> 一、内存管理的基本概念:<span style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial">指软件运行时对内存资源的分配和使用的技术。<span style="margin:0px; padding:0px">二、OC 内存管理的范围:管理任何继承NSObject的对象,对其他的基本数据类型无效 <span style="margin:0px; padding:0px">栈区 (局部变量,所在在代码块或者函数结束时自动回收,不需要程序员管理) 高地址堆区 (OC中,动态分配,OC中new出来的对象,需要管理)BSS段 数据区 代码区 (程序启动自动加载,不需要管理) 低地址<span style="margin:0px; padding:0px">三、 内存管理的原理<span style="margin:0px; padding:0px"> 1)对象的所有权及引用计数 任何对象都可能拥有一个或者多个所有者,只要一个对象至少还拥有一个所有者,它就会继续存在 Person * p = [[Person alloc] init]; p就是动态分配出来的内存的一个所有者,[p retainCount] = 1<span style="margin:0px; padding:0px"> 对象的引用计数: 每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有几个拥有者在使用这个对象,<span style="margin:0px; padding:0px"> 对象刚被创建时,默认计数器值为1,当计数器值变为0时,则对象销毁。 每个OC对象内部,都专门有<span style="margin:0px; padding:0px; display:inline-block; color:white">8个字节</span>的存储空间来存储引用计数器。<span style="margin:0px; padding:0px"> 2) 引用计数器的作用 引用计数器是判断对象要不要回收的依据(存在一种例外:对象值为nil时,引用计数为0,但不回收空间)就是计数器是否为0,若不为<span style="margin:0px; padding:0px"> 0则存在 <span style="margin:0px; padding:0px"> Person * p = nil; [p retainCount]为0,但不回收,因为根本没有分配空间<span style="margin:0px; padding:0px"> 3)对引用计数器的操作 给对象发送消息,进行相应的计数器操作 retain消息:使计数器+1,该方法返回对象本身。</span></span></span></span></span></span></span></span></span></span></span><span style="margin:0px; padding:0px; color:rgb(51,51,51)"> </span><pre code_snippet_id="1869313" snippet_file_name="blog_20160906_2_9599515" name="code" class="objc"> Person * person = [[Person alloc] init]; [person retain];//此时person的引用计数为2
release消息:使计数器-1 (并不代表释放对象)
Person * person1 = [[Person alloc] init]; [person1 release];//此时person的引用计数为0
retainCount消息:获得对象当前的引用计数器值 %ld %lu
Person * person2 = [[Person alloc] init]; [person2 retainCount];//此时返回person的引用计数值
4)对象的销毁当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,这里释放相关的资源。dealloc就像是对象的
“临终遗言”。
一旦重写了dealloc方法就必须调用[super dealloc],并且在代码块的最后调用(不能直接调用dealloc方法)。
一旦对象被回收了,那么它所占用的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误) 。
注意:
1)如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收(除非整个程序已经退出)
2)任何一个对象,刚分配内存下来的时候,引用计数器都为1,。(对象一旦创建好,默认引用计数器就是1)当使用
alloc、new或者copy创建一个对象时,对象的引用计数器默认就是1
三、OC内存管理分类
1)OC提供了三种内存管理方式
MannulReference Counting (MRC)手动内存管理
automatic reference counting (ARC )自动内存管理
garbage collection (垃圾回收) IOS不支持垃圾回收
ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
开发中如何使用:需要理解MRC,但实际使用时尽量使用ARC
0 0
- OC基础:内存(内存管理)
- WINCE内存管理基础
- android基础--内存管理
- 内存管理基础
- 内存管理基础
- 基础篇---内存管理
- java内存管理基础
- 计算机基础-内存管理
- Android内存管理基础
- 内存管理基础
- OC基础-内存管理
- 内存管理基础笔记
- iOS内存管理基础
- 内存管理的基础
- OC 内存管理基础
- Linux内存管理基础
- ios基础---内存管理
- JVM内存管理基础
- HDU 5090--Game with Pearls【二分图最大匹配】
- *nux平台上的C10M问题
- Ubuntu之Gitlab、Gerrit、Jenkins协调工作配置
- HttpURLConnection请求图片
- 计算机系统(六)OS 管理 硬件
- 内存管理基础
- 用一个textview显示数字,让数字从一个值渐变到另外一个值
- PowerBuilder 使用JDBC连接MYSQL
- Git Push 避免用户名和密码方法
- SpringMVC jdbc返回的不是标准对象时处理方法
- leetcode Path Sum 路径和
- 一组成绩,一组学生,按照成绩的大小,由高到底排序出姓名和成绩(二叉树)实现
- github的一些常用方法
- 拓扑排序之NOIP2003神经网络