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關鍵字

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章