• OC基础:内存(内存管理) 分类: ios学习 OC 2015-06-25 16:50 73人阅读 评论(0) 收藏


    自动释放池:

    @autoreleasepool {

    }

    内存管理机制       谁污染,谁治理

    垃圾回收机制:gc(Garbage collection),由系统管理内存,开发人员不需要管理.

    OC从版本2.0之后开始支持垃圾回收机制,但iOS开发平台不支持垃圾回收机制


    继承自NSObject的对象需要内存管理

    OC中通过引用计数器管理内存


    通过引用计数器管理内存的两种方式

    1.MRC:(maual reference count),手动引用计数,就是开发人员通过引用计数管理内存

    2.ARC:(Automatic reference count),自动引用计数,由系统自动通过引用计数管理内存

    ARC是基于MRC创建出来的

    使用alloc生成对象的时候会将引用计数由0变为1



    打印引用计数

    retainCount:引用计数

    打印retainCount 需要在ARC之下.

    retainCount占4个字节

    当retainCount变为0的时候,会自动调用dealloc方法.

    -(void)dealloc{

        NSLog(@"%@对象已经被销毁",_name);

        [superdealloc];//必须调用superdealloc,且写在最下面

    }



    僵尸对象:所占内存已经对回收的对象.僵尸对象不能再使用.

    野指针:指向僵尸对象的指针.


    空指针;没有指向任何东西的指针(nil,NULL,0).如:per1=nil;

    操作空指针不会报错


    alloc对应dealloc        retain对应relase


    autoreleaserelease的区别

             1.autorelease相比release,也是对引用计数器执行减一操作,但不是立即减一,而是在未来的某个时刻减一(出了自动释放池)

             2.autorelease的实质;对一个对象使用autorelease操作,这个对象的引用计数不会立即减一,对象会被放到自动释放池里,待出了释放池才减一

            

     for (int i=0; i<1000000; i++) {

                Person *person=[[Personalloc]init];//1

                //数组会对添加的对象做一次引用计数+1

                // 数组在释放自己之前,会对之前添加的所有元素release操作(引用计数-1)

                [array addObject:person];//2

                [person release];//1

                }


    copy的使用:

    对象使用copy的前提:这个类遵循了NSString ,且必须实现协议内的方法.

    把某一内存区域的内容拷贝一份,拷贝到新的内存空间⾥去,被拷⻉区域的引⽤计数不变,新的内存区域的引用计数为1


    -(id)copyWithZone:(NSZone *)zone{

        //浅拷贝:拷贝的是指针(地址)

        //    return [self retain];

        

        //深拷贝:拷贝的是内容.

        //    返回一个新的对象,跟原来的对象所占空间大小相同,空间内的内容也是相同的

        Person *p=[[PersonallocWithZone:zone]init];

        p.name=self.name;

        return p;

    }




      

    new:申请内存并将retainCount从0变1


    -------------------

    //内存管理了原则

            //        +1:alloc,copy,new,retain

            //        -1:release,autorelease

            //        一旦对象的引用计数器为0,系统会自动调用dealloc方法,之后就不能再对对象进行操作

            //        谁污染谁治理

          


    //自动释放池的两种形式

        //1.

        @autoreleasepool {

            

        }

        //2.自动释放池的另一种形式(想当于自己建立的释放池)

        NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];

        

        [pool release];







    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    java中&和&&
    java保留字
    最优路径算法合集(附python源码)(原创)
    十大经典排序算法(python实现)(原创)
    电子欠款单设想(原创)
    羽毛球友谊赛规则(附带程序)(原创)
    基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
    lazy_import源码解析(原创)
    多线程的音频打标记的python实现(原创)
    关于塔防游戏的浅析(原创)
  • 原文地址:https://www.cnblogs.com/shaoting/p/4619813.html
Copyright © 2020-2023  润新知