• iOS——引用计数(一)


    自动引用计数

    自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。
    满足以下要求后,我们的代码就无需再次键入retain或者是release代码了:

    1. 使用Xcode 4.2或以上版本
    2. 使用LLVM编译器3.0或以上版本
    3. 编译器选项中设置ARC为有效
      在以上条件下编译源代码时,编译器将自动进行内存管理。

    手动内存管理/引用计数

    OC中对象所做的动作:1、生成对象;2、持有对象;3、释放对象;4、废弃对象
    在这里插入图片描述

    内存管理的思考方式

    • 自己生成的对象,自己所持有
    • 非自己生成的对象,自己也能持有
    • 不再需要自己持有的对象时释放
    • 非自己持有的对象无法释放
      除了上面提到的“生成”、“持有”、“释放”,在OC的内存管理中还要加上”废弃“一词。
      以上的操作对应的OC方法:
      这些有关OC内存管理的方法,实际上不包含在OC该语言中,而是包含在Cocoa框架中用于OS X、iOS应用开发。Cocoa框架中Founfation框架类库的NSObject类负担内存管理的职责。OC内存管理中的alloc/retain/relesase/dealloc方法分别指代NSObject类的alloc类方法、retain实例方法、release实例方法和delloc实例方法。
      在这里插入图片描述

    自己生成的对象,自己所持有

    使用以下名称开头的方法意味着自己生成的对象只有自己持有:

    • alloc
    • new
    • copy
    • mutableCopy

    非自己生成的对象,自己也能持有

    除了用上面名称开头的方法,用其他的方法创建的对象都是非自己生成的对象,但是自己也能持有。例如:

    id obj = [NSMutableArray array];
    
    • 1

    在该代码中,NSMutableArray类对象被赋值给变量obj,但是变量obj并不自己持有该对象。使用retain方法可以使非自己生成的对象成为自己所持有的。

    [obj retain];
    
    • 1

    不再需要自己持有的对象时释放

    自己持有的对象不再需要时,持有者有义务释放该对象:释放使用release方法

    [obj release];
    //释放对象
    
    • 1
    • 2
    - (id)allocObject {
      id obj = [[NSObject alloc] init];
      return obj;
    }
    
    • 1
    • 2
    • 3
    • 4
    //取得非自己生成但是自己持有的对象
    id obj1 = [obj0 allocObject];
    
    • 1
    • 2
    对象一经释放绝对不可访问
    
    • 1

    非自己持有的的对象,若用retain方法变为自己持有,也同样可以使用release方法释放。被自己持有的对象一旦不再需要,务必要释放。

    • autorelease方法:该方法可以使取得的对象存在,但是自己不持有:
    - (id) object {
      id obj = [[NSObject alloc] init];
      [obj autorelease];
      return obj;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • autorelease方法提供这样的功能,使对象在超出指定的生存范围时能够自动并正确的释放
      当然,也可以通过retain方法将调用autorelease方法取得的对象变为自己持有
      在这里插入图片描述

    无法释放非自己持有的对象

    访问已经被废弃的对象,或者释放“取得的对象存在,但是自己不持有对象”的时候,会发生崩溃

  • 相关阅读:
    Chrome 配置samesite=none方式
    嵌入式算法19---国家商用密码SM算法
    Spring注解大揭秘:从URI到请求体,无所不能
    Allegro166背钻设置指导
    (三十)大数据实战——HBase集成部署安装Phoenix
    Node.js安装使用
    阿里云MySQL从 2003->1251->1396
    ClickHouse 存算分离改造:小红书自研云原生数据仓库实践
    React报错之React hook 'useState' cannot be called in a class component
    创建型设计模式- C++实现
  • 原文地址:https://blog.csdn.net/m0_73348697/article/details/133187091