_weak typeof(self) weakSelf = self;
第一纱皆、weak弱引用不能持有對象實(shí)例。
在持有某對象的弱引用時(shí)揭绑,若該對象被廢棄坦报,則此弱引用自動失效并處于nil被賦值的狀態(tài)。
第二休玩、內(nèi)存管理原則
1著淆、默認(rèn)strong,可選weak拴疤。strong下不管成員變量還是property永部,每次使用指針指向一個對象,等于自動調(diào)用retain(), 并對舊對象調(diào)用release(),所以設(shè)為nil等于release呐矾。
2苔埋、只要某個對象被任一strong指針指向,那么它將不會被銷毀蜒犯,否則立即釋放组橄,不用等runloop結(jié)束荞膘。所有strong指針變量不需要在 dealloc中手動設(shè)為nil,ios會自動處理玉工,debug可以看到全部被置為nil羽资,最先聲明的變量最后調(diào)用dealloc釋放。
3遵班、官方建議IBOutlet加上__weak屠升,實(shí)際上不用加也會自動釋放;
4狭郑、優(yōu)先使用私有成員變量腹暖,除非需要公開屬性才用property。
5愿阐、避免循環(huán)引用微服,否則手動設(shè)置nil釋放。
6缨历、block方法常用聲明:@property (copy) void(^MyBlock)(void); 如果超出當(dāng)前作用域之后仍然繼續(xù)使用block以蕴,那么最好使用copy關(guān)鍵字,拷貝到堆區(qū)辛孵,防止棧區(qū)變量銷毀丛肮。
7、創(chuàng)建block匿名函數(shù)之前一般需要對self進(jìn)行weak化魄缚,否則造成循環(huán)引用無法釋放controller:
__weak MyController weakSelf = self 或者 __weak __typeof(self) weakSelf = self;
執(zhí)行block方法體的時(shí)候也可以轉(zhuǎn)換為強(qiáng)引用之后再使用:MyController strongSelf = weakSelf; if (!strongSelf) { return; }
第三宝与、關(guān)于__weak和__block區(qū)別總結(jié)
__weak 聲明了一個可以自動 nil 化的弱引用。
1.__block不管是ARC還是MRC模式下都可以使用冶匹,可以修飾對象习劫,還可以修飾基本數(shù)據(jù)類型。
2.__weak只能在ARC模式下使用嚼隘,也只能修飾對象(NSString)诽里,不能修飾基本數(shù)據(jù)類型(int)。
3.__block對象可以在block中被重新賦值飞蛹,__weak不可以