• [OC]MRC和ARC


    OC中,创建了一个对象,就会在内存中开辟一个空间,obj的指针就指向这块空间⬇️

    referenceCount:引用计数器:存储当前有多少指针引用这块空间。

    此时referenceCount为1。

    如果再创建其他对象也指向obj⬇️obj就会调用retain方法:

    referenceCount就会自动+1,此时referenceCount为4(第一个obj创建NSObject alloc的时候就+1了)。

    当不要一个对象的时候,如果调用release方法,referenceCount就会-1,如果obj1调用一次,obj2调用一次,obj3调用一次,referenceCount就会变为1,如果最后obj也调用一次,referenceCount就会变为0,此时系统将真正回收这块空间。

    现在创建的工程自动使用ARC,如何改为MRC呢?

    创建一个Dog类,测试retain方法

    Dog *dog = [[Dog alloc]init];//开辟一个内存空间,指针dog指向该空间
    NSLog(@"%zd",dog.retainCount);
    Dog *dog1 = dog;
    NSLog(@"%zd",dog.retainCount);
    

     这样打印出来的retainCount都是1,也就是说并没有多一个指针指向该空间。要如何解决呢?

    Dog *dog1 = [dog retain];
    

     如果是这样把dog的指针给dog1,此时retainCount就会变成2。

    如果要干掉dog1,需要这样操作⬇️

    [dog1 release];//告诉dog少了一个指针指向它
    dog1 = nil;//置为空,避免乱指
    

     内存管理的黄金法则:

    对一个OC对象进行alloc、retain、copy、mutableCopy的时候需要对该对象进行release或autoRelease操作。

    当引用计数器为0,object会调用一个析构方法,系统会回收内存空间,现在我们在Dog类中重写析构方法看看到底什么时候调用了dealloc方法⬇️

    在.m文件中

    -(void)dealloc
    {
        NSLog(@"Dog is dead");
        [super dealloc];//回收内存
    }
    

     接下来把狗一只只杀死

    [dog2 release];
    dog2 = nil;
    [dog release];
    dog = nil;
    

     此时打印结果是这样的:

    我们可以看到,最后一只狗dog被release的时候,系统调用了dealloc,此时引用计数器为0。

  • 相关阅读:
    Maven安装
    (字符串哈希表)找到字符串中不重复出现字符的最长子串长度
    (动态规划)给定三角形,找到从上到下的最小路径总和
    (链表)删除链表的重复元素
    (树)判断二叉树是否为BST
    (动态规划)机器人走迷宫问题
    (数组)Largest Rectangle in Histogram(栈解问题)
    (树)每一层节点的右指针问题(层次遍历)
    (字符串)count and say
    (贪心)加油站绕圈问题
  • 原文地址:https://www.cnblogs.com/ybw123321/p/5510996.html
Copyright © 2020-2023  润新知