zoukankan      html  css  js  c++  java
  • iOS 内存管理机制和循环引用处理方法

    简述

    ARC: 自动引用计数, Automatic Reference Counting

    MRC: Mannul Reference Counting

    ARC工作原理

    1.当每次创建一个新实例时,ARC会分配一块内存用来存储实例信息,在内存中会包含实例的类型信息,以及这个实例所有的相关属性的值。

    2.如果该实例不再被使用时,ARC会自动释放实例所占用的内存,并让释放的内存存储其他的数据。这样能保证使用的实例不会一直占用内存空间。

    3.ARC收回和释放了正在被使用的实例,该实例的属性和方法将不能再被访问和调用,一旦尝试调用,会造成应用程序的崩溃

    4.为了保证使用中的实例不会被销毁,ARC会跟踪和计算每一个实例被多少属性,常量和变量所引用,一旦有引用,都会对实例创建强引用。强引用会将实例牢牢的保持住,只要强引用还在,实例就不会被销毁。

    循环强引用问题

    循环强引用是指两个对象相互进行创建了强引用,这样的话2个实例的内存将永远不会被释放。

    这样的话会造成内存泄漏。可以通过弱引用(Weak Reference)或无主引用(Unowned Reference)解决这个问题。

    代码中常用写法

    OC

    //定义一个宏
    #define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;
    
    //调用的时候
    WS(weakSelf);
        [XPApiManager getVideoListWithType:self.listType pageIndex:self.pageIndex pageSize:self.pageSize progress:^(NSProgress *progress) {
            [weakSelf.tableView reloadData];
        } finished:^(NSString *msg, id responseObject) {
        
        }
    

      

    @property (weak, nonatomic) id<XPDetailMenuPopViewDelegate> delegate;
    
    @property (weak, nonatomic) IBOutlet UIImageView *imgFavorite;
    

      

    Swift

    lazy var strHTML: () -> String = {
            [unowned self] in
            //代码编写区
       self.XXX }

      

    XPHomeViewModel.loadCategoryGroup { [weak self] (outGroups) in
                self!.outGroups = outGroups
            }
    

      

    weak var tmpSelf = self
    CouponData.loadCouponData { (data, error) -> Void in
            tmpSelf!.couponTableView?.reloadData()
    }
    

      

    weak var delegate: YMCategoryBottomViewDelegate?
    
    @IBOutlet weak var tableView: UITableView!
    

      

    补充参见:

    Swift中strong,weak,unowned关键字

  • 相关阅读:
    软件创意——汽车语音安全系统
    对系统管理岗位的理解。
    求二维数组最大子数组的和。郭林林&胡潇丹
    电梯调度 结对项目开发(郭林林&胡潇丹)
    电梯调度 结对项目开发
    电梯调度 结对项目开发
    电梯调度的设计与实现过程(李帅 张硕)
    敏捷软件方法综述
    二维数组的子数组和最大问题(李帅 张硕)
    求数组子数组和的最大值 (线性算法)
  • 原文地址:https://www.cnblogs.com/xiaopin/p/5833482.html
Copyright © 2011-2022 走看看