• OC内存管理


    1、内存管理-黄金法则

    The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.

    如果对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease。

    类型定义:

      基本类型:任何C的类型,如:int、short、char、long、struct、enum、union等属于基本类型或者结构体;

      内存管理对于C语言基本类型无效;

      任何继承与NSObject类的对象都属于OC类型。

      所有OC对象都有一个计数器,保留着当前被引用的数量。

    2、内存管理对象:

      OC的对象:凡是继承于NSObject;

      每一个对象都有一个retainCount计数器。表示当前的被应用的计数。如果计数为0,那么就真正的释放这个对象。

    3、alloc、retain、release函数:

      1)alloc 函数是创建对象使用,创建完成后计数器为1;只用1次。

      2)retain是对一个对象的计数器+1;可以调用多次。

      3)release是对一个对象计数器-1;减到0对象就会从内存中释放。

     增加对象计数器的三种方式:

      1)当明确使用alloc方法来分配对象;

      2)当明确使用copy[WithZone:]或者mutableCopy[WithZone:]copy对象的时;

      3)当明确使用retain消息。

    上述三种方法使得计数器增加,那么就需要使用[auto]release来明确释放对象,也就是递减计数器。

    4、深复制和浅复制

           对象的拷贝分为浅拷贝和深拷贝,浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址,深拷贝则相当于不仅拷贝了一个对象还拷贝了它的属性,即完全是两个东西,只不过内容相同而已。

           拷贝用到协议,如果这个类创建对象后,这个对象要被拷贝,那么这个类就需要用到拷贝协议,分两种:<NSCopying>和<NSMutableCopying>相当于一个是拷贝,另一个是拷贝后可修改。

        1)如果是Foundation框架里地不可变对象,就是Array,NSString等创建的对象,直接用copy来拷贝相当于retain,也就是属性还是同一个;

        2)如果是用mutableCopy来拷贝,不管是可变还是不可变对象,属性神马的都直接拷贝了一份,即真正意义上得拷贝,它拷贝出来的对象统统都是可变的;

        3)如果是可变对象,我们用copy也能实现真正意义上的拷贝,但是拷贝出来的对象是不可变的。

  • 相关阅读:
    Orika对象复制教程(完美笔记)
    JAVA-开发构建Gradle项目安装使用教程
    Java中传入一个时间范围,取出该时间范围内所有日期的集合
    线程安全之原子操作
    Java内存模型以及线程安全的可见性问题
    Java线程池的应用
    Java中实现线程的方式
    线程通信
    线程状态
    CPU缓存和内存屏障
  • 原文地址:https://www.cnblogs.com/lmg4819/p/4802681.html
Copyright © 2020-2023  润新知