• 【ARC机制下单个对象的内存管理 Objective-C语言】


    前言

    1)ARC下的单个对象的内存管理
    在ARC的机制下,当1个对象没有任何的强指针指向它的时候,这个对象就会被立即回收。
    什么时候1个对象就没有强指针指向它了呢?
    例如:有一个Person类
    @interface Person : NSObject
    @end

    @implementation Person
    – (void)dealloc
    {
    NSLog(@“人挂了。。。”);
    }
    @end

    #import
    #import “Person.h”
    int main()
    {
    if(1)
    {
    Person *p1 = [Person new];
    __weak Person *p2 = p1 ;
    }
    return 0;
    在if语句的大括弧结束的时候,强指针p1和弱指针p2就都被销毁了,没有强指针指向Person对象了,Person对象就被销毁了。
    2)在例如:
    int main()
    {
    __weak Person *p2 = nil;
    if(1)
    {
    Person *p1 = [ Person new];
    p2 = p1;
    }
    return 0;
    }
    if语句的大括弧结束的时候,强指针p1被销毁了,弱指针p2还没被销毁,Person对象没有强指针指向它了,也就被销毁了。。。

    一、什么叫没有任何强指针指向对象?

    1、当指向对象的所有的强指针被回收的时候,对象就会被立即回收。。。

    2、将所有指向对象的强指针赋值为nil的时候,对象就会被立即回收。。。

    这两种情况,就叫没有任何强指针指向对象

    1)指向对象的所有强指针,被回收掉了。。。
    2)指向对象的所有强指针,赋值为nil
    例如:Person *p1 = [Person new];
    Person *p2 = [Person new];
    __weak Person *p3 = p2;
    p1 = p2 = nil;
    这个时候,对象也会被回收。。。

    二、详细说明强指针和弱指针。。。

    1.强指针和弱指针的声明

    1)默认情况下,所有的指针都是强指针。也就是说,我们之前声明的指针变量都是强类型的。
    p1指针是强类型的,因为默认情况下,指针都是强类型的。
    Person *p1 = [[Person alloc] init];

    2.不过,我们可以使用__strong来显示的标识指针是强类型的指针

    __strong Person *p2 = [Person new];
    这个时候p2指针类型是强指针类型的,其实写不写__strong都是强类型的指针。

    3.指针类型也可以是弱指针类型,使用__weak标识的指针类型是弱指针类型

    __weak Person *p3 = p2;
    这个时候,p3指针就是1个弱类型的指针,p3弱指针也指向p2指针指向的对象。

    4.在操作对象的时候,通过强指针或者弱指针都可以操作,没有任何区别

    三、ARC模式下对象的回收标准

    1.ARC机制下释放一个对象的标准是:没有任何强指针指向对象的时候,对象就会被释放,如果这个时候有弱指针指向呢,也会被释放。

    2.最重要的1点:如果创建对象的时候,用1个弱指针存储这个对象的地址,那样一旦创建出来,这个对象就会被立即回收

    例如:__weak Person *p1 = [[ Person alloc ] init ];
    这个时候,p1指针指向的Person对象,刚创建出来,就会被回收。

    3. 例如:Person类有一个sayHi方法

    – (void)sayHi
    {
    NSLog(@“大家好,我是人。。。”);
    }

    int main()
    {
    Person *p1 = [ Person new];
    __weak Person *p2 = p1;
    p1 = nil;
    [p2 sayHi];
    }
    [p2 sayHi];这句话,会报僵尸对象错误。。。,但是,为什么没有报僵尸对象错误呢,请看下面:

    4. 在ARC的机制下,当对象被回收的时候,原来指向这个对象的弱指针,会被自动设置为nil

    所以,上面这句话[p2 sayHi];不会报错,因为现在p2这个弱指针被自动设置为nil了。。。

  • 相关阅读:
    js中,函数的两种命名方式-声明式、函数表达式 & 自执行匿名函数 (function(){})()之删除对象中的属性
    Html_Css问答集(2)
    APT攻击的特点及含义
    2023吉首大学计算机考研信息汇总
    chatGPT PLUS 绑卡提示信用卡被拒的解决办法
    QT工具MaintenanceTool.exe如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题)
    脚本:批量修改语音后缀(比如flac转wav) + 对语音进行重采样
    使用JavaScript计算两点经纬度之间的弧线点经纬度数组
    错误:ModuleNotFoundError: No module named ‘httplib‘
    树莓派4b装系统到运行 Blazor Linux 本地程序全记录
  • 原文地址:https://blog.csdn.net/madoca/article/details/126456043