iOS 記憶體管理機制和循環參考處理方法,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 = selfCouponData.loadCouponData { (data, error) -> Void in tmpSelf!.couponTableView?.reloadData()}
weak var delegate: YMCategoryBottomViewDelegate?@IBOutlet weak var tableView: UITableView!