iOS 内存管理机制和循环引用处理方法

简述swift

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

MRC: Mannul Reference Countingatom

 

ARC工做原理对象

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

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

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

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

 

循环强引用问题table

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

这样的话会形成内存泄漏。能够经过弱引用(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关键字

相关文章
相关标签/搜索