簡述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!
補充參見: