• 三、Object-C内存管理


    一、管理范围:任何继承了NSObject的对象,对基本数据类型无效

    原理:

    1.每个对象都有个引用计数器,是一个与之关联的整数

    2.使用了alloc,new,copy等关键词会对对象的计数器计数为1

    3.给对象发送一条retain消息,可以使对计数器+1

    4.给对象发送一条release消息,可以使对计数器-1

    5.当一个对象的的引用计数器的值为0时,那么它将被销毁,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法(类似遗言遗言),一定不要直接调用dealloc方法

    - (void)dealloc{

        NSLog(@"%@被销毁了",self);

        [superdealloc];//一定要调用superdealloc方法,而且最好放在最后面调用

    }

    6.可以给对象发送retainCount消息获得当前的引用计数器值

     NSLog(@"count=%zi",[obj retainCount]);

     

    二、内存管理的原则

    1.谁创建,谁释放,如果你通过alloc,new或者copy创建一个对象,那么你必须调用release或autorelease,不是你创建的,就不用去释放

    2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease

    3.谁retain,谁release,如果调用了retain,就算没创建对象,也要release

    三、自动释放池(autorelease pool)

    自动释放池是OC里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

    当自动释放池销毁,池里所有对象都会调用一次release方法

    如何将对象加入自动释放池?

    OC对象只需要发送一条autorlease消息,就会把这对象添加到最近的自动释放池中(栈顶的释放池)

    autorelease实际上只是把对release的调用延迟了,系统只是把对象放入到池中,当池被释放时,所有池中对象就会调用一次release

    //@autoreleasepool代表创建一个自动释放池(IOS5后)

    @autoreleasepool{

      Student *stu = [[[Student alloc] init] autorlase];

    }

    一般可以写一个创建对象的静态方法

    + (id)student{//潜规则,方法名和类名一致,开头字母改为小写

      Student *stu = [[[Student alloc] init] autorlase];

      return stu;

    }

    autoreleasepool注意

    1.不要把大量循环操作昂到同一个自动释放池(NSAutoreleasePool)之间,这样会造成内存峰值上升

    2.尽量避免打对大内存使用该方法

    3.SKD中一般利用静态方法创建的对象都已经是 autorelease的,不需要在进行release操作

  • 相关阅读:
    1046 A^B Mod C
    1019 逆序数
    1012 最小公倍数LCM
    1011 最大公约数GCD
    序列化
    bigdecimal
    equals 和hashcode
    java多线程-读写锁原理
    Java并发编程:volatile关键字解析
    面试
  • 原文地址:https://www.cnblogs.com/hqr9313/p/3513450.html
Copyright © 2020-2023  润新知