• 【NSArray和NSDictionary的内存管理 Objective-C语言】


    一、集合

    1.什么是集合:

    NSArray、NSDictionary,就叫做集合

    只不过我们之前叫它们什么,是不是叫数组啊,后面我们一般情况下不叫它们数组,叫做集合,

    NSArray叫集合,NSDictionary叫字典集合,

    2.内存管理什么意思呢,

    我们现在先把ARC关掉

    再来一个Person类,

    在main.m文件中,把这个Person类引进来

    #import

    #import

    int main(){

    //现在我要做一件事情,做一件什么事情呢,

    //我创建1个Person对象

    Person *p1 = [Person new];

    //有对象的创建,我们说过,是不是马上跟1个release啊

    //好了,我在最后面来一个,[p1 release];

    //当然,你也可以把它放到哪儿去,是不是放到自动释放池里面去啊,好了,不管了,不放了啊,

    //现在我来个NSArray

    NSLog(@“%lu”,p1.retainCount);

    NSArray *arr = @[p1];

    NSLog(@“%lu”,p1.retainCount);

    //是不是我还要来个arr release啊,不然是不是这个数组不能释放啊,

    [arr release];

    [p1 release];

    return 0;

    }

    //好了,我们的目的在于什么地方,我是不是把这个p1存到数组里面去了,

    //在MRC的模式下,将1个对象存储到集合当中,会不会影响对象的引用计数器

    //其实,我们可以看一下啊,NSLog(@“%lu”,p1.retainCount),我把这句话写到前面去,写到把p1存储到集合当中之前,在写到后面去,写到把p1存储到集合当中之后,

    输出:1

    2

    是不是会影响p1的引用计数器啊,因为arr它在用p1啊

    因为这个集合在用啊,所以肯定会加1,对不对,

    将对象存储到集合之中,

    所以记住,将对象存储到集合当中,会为对象的引用计数器,加1

    那这个数组销毁的时候呢,

    我在[arr release];这句话后面,再打出来看看,NSLog(@“%lu”,p1.retainCount);

    int main(){

    Person *p1 = [Person new];

    NSLog(@“%lu”,p1.retainCount);

    NSArray *arr = @[p1];

    NSLog(@“%lu”,p1.retainCount);

    [arr release];

    //这个时候,是不是数组销毁了啊,数组销毁的时候,它会怎么做呢

    //会不会为这个,存储在数组里面的对象,release一下呢

    NSLog(@“%lu”,p1.retainCount);

    [p1 release];

    return 0;

    }

    输出:1

    2

    1

    数组一旦销毁,就会向存储在数组中的对象,发送1条release消息

    当集合销毁的时候,就会向存储在集合中所有的对象发送1条release消息,

    3.我来一个autoreleasepool

    int main(){

    @autoreleasepool{

    //我创建1个数组

    NSArray *arr = [NSArray arrayWithObjects:@“jack”,@“rose”,@“lili”,nil];

    }

    //我的问题是什么呢,这个arr数组,会不会加到这个自动释放池里面去,

    //会,因为我们这个对象,是通过同名的类方法创建的,我们讲过,根据类规范,如果是通过同名的类方法创建的对象,那么它是不是已经被自动autorelease过了吧

    //那我用下面这种方式创建对象,会不会自动加入到自动释放池里面去呢,

    NSArray *arr2 = @[@“jack”,@“rose”,@“lili”];

    //也会,用这种方式,创建的NSArray对象,也已经是被autorelease过了的,

    return 0;

    }

    4.使用@[]或者@{}创建的集合,已经是被autorelease过了的,

    直接调用同名的类方法,创建的对象 ,也是被autorelease过了的,

    5.我们之前是在MRC模式下对不对,那如果现在我们在ARC模式下,我关心的是什么,

    例如,我有一个Person对象,我把它存到NSArray数组里面,

    int main(){

    Person *p1 = [Person new];

    NSArray *arr = @[p1];

    //在ARC模式下,我们关心的是什么,关心的是这个数组的元素,是强类型,还是弱类型,

    //是强类型的

    6.在ARC的模式下,集合的元素,是1个强类型的指针

    好了,以上就是NSArray和NSDictionary的内存管理 Objective-C语言

  • 相关阅读:
    【生信分析】基于TCGA肿瘤数据进行基因共表达网络分析
    Dubbo的架构设计是怎样的?
    C++标准模板(STL)- 类型支持 (属性查询,获取数组类型的维数)
    Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程
    Docker
    2022杭电多校联赛第七场 题解
    DNS有什么作用 43.227.220.X
    LeetCode_35_搜索插入位置
    深入探索Android Service:后台服务的终极指南(下)
    Flink 的 Checkpoint配置详解
  • 原文地址:https://blog.csdn.net/madoca/article/details/127950101