内存管理基础

来源:互联网 发布:.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
原创粉丝点击