• Objective


    在我们之前的手动引用计数中, 我们都知道在循环引用如果两边使用retain的话, 那么两个对象谁也不会释放谁, 那么在ARC中呢??? 其实也是一个道理, 前面我们知道了ARC的特性, 是使用强弱指针来判断对象是否要被释放, 那么循环引用是否也是一样呢? 下面让我们一起来看看:


    例子:

    #import <Foundation/Foundation.h>
    @class Car;
    
    @interface Person : NSObject
    
    @property (nonatomic, strong) Car *car;
    
    @end
    
    @implementation Person
    
    - (void)dealloc
    {
        NSLog(@"Person对象被释放了.");
    }
    
    @end

    #import <Foundation/Foundation.h>
    @class Person;
    
    @interface Car : NSObject
    
    @property (nonatomic, strong) Person *person;
    
    @end
    
    @implementation Car
    
    - (void)dealloc
    {
        NSLog(@"Car对象被释放了.");
    }
    
    @end

    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Car.h"
    
    int main(int argc, const char * argv[])
    {
        Person *p = [[Person alloc] init];
        
    
        Car *c = [[Car alloc] init];
        
        p.car = c;
        c.person = p;
        
        return 0;
    }
    

    运行之后, 什么都不会打印, 因为这两个对象都在相互强引用, 所以谁也不会被释放, 看看示意图:



    根据ARC的机制, 只要对象有强指针指向, 那么就不会被释放, 所以例子里也就不会被释放, 想到这里, 有人就应该想到解决办法, 把其中一个改成弱指针, 继续往下看:

    #import <Foundation/Foundation.h>
    @class Car;
    
    @interface Person : NSObject
    
    @property (nonatomic, weak) Car *car;
    
    @end
    

    这里把Person里面的Car改成weak, 再看看打印结果:

    2015-01-29 14:28:58.283 2.ARC循环引用[3087:255117] Car对象被释放了.
    2015-01-29 14:28:58.284 2.ARC循环引用[3087:255117] Person对象被释放了.
    



    示意图:




    cp被释放后, 那么Person就会被释放, 它里面的_carweak指针, 所以也会被释放, 一旦整个Person对象被释放了, 那么Car里面的成员变量_Person也会被释放, 紧接着Car也会被释放, 所以打印出来的结果就会全部对象被释放~~~





    总结:

    1. 在ARC机制中的循环引用解决方案:

    1> 一端为strong指针, 另一端为weak指针.

    2> assign一般只用在基本数据类型.



    2.在非ARC机制中的循环引用解决方案:

    1> 一端为retain指针, 另一端为assgin指针.





    好了, 这次我们就讲到这里, 下次我们继续~~

  • 相关阅读:
    在Exchange 2013中重置用户密码
    在exchange邮箱服务器上启用反垃圾邮件功能
    EMC队列 发件人为空 From Address: <>
    zabbix删除历史记录
    ESXi 6.7 CVE-2018-3646警告的处理
    CentOS安装nmap端口查看工具
    webpack学习
    vscode 点滴
    chrome点滴
    前端资料汇总
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282818.html
Copyright © 2020-2023  润新知