// 不知道這行代碼的使用場(chǎng)景的同學(xué)你該去自習(xí)看看ARC的注意事項(xiàng)和Block的使用了 //
1栖茉、__weak __typeof(&*self)weakSelf = self;
2、__weak __typeof(self) weakSelf = self;
3尺借、__weak XxxViewController *weakSelf = self;
4、__weak id weakSelf = self;
_weak typeof(self) weakSelf = self; (一)內(nèi)存管理原則 1岔乔、默認(rèn)strong肉瓦,可選weak。strong下不管成員變量還是property做鹰,每次使用指針指向一個(gè)對(duì)象击纬,等于自動(dòng)調(diào)用retain(), 并對(duì)舊對(duì)象調(diào)用release(),所以設(shè)為nil等于release。 2钾麸、只要某個(gè)對(duì)象被任一strong指針指向更振,那么它將不會(huì)被銷毀,否則立即釋放饭尝,不用等runloop結(jié)束肯腕。所有strong指針變量不需要在dealloc中手動(dòng)設(shè)為nil,iOS會(huì)自動(dòng)處理钥平,debug可以看到全部被置為nil实撒,最先聲明的變量最后調(diào)用dealloc釋放。
3、官方建議IBOutlet加上__weak奈惑,實(shí)際上不用加也會(huì)自動(dòng)釋放吭净;
4、優(yōu)先使用私有成員變量肴甸,除非需要公開屬性才用property寂殉。
5、避免循環(huán)引用原在,否則手動(dòng)設(shè)置nil釋放友扰。
6、block方法常用聲明:@property (copy) void(^MyBlock)(void); 如果超出當(dāng)前作用域之后仍然繼續(xù)使用block庶柿,那么最好使用copy關(guān)鍵字村怪,拷貝到堆區(qū),防止棧區(qū)變量銷毀浮庐。
7甚负、創(chuàng)建block匿名函數(shù)之前一般需要對(duì)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; }
(一)typeof關(guān)鍵字是C語言中的一個(gè)新擴(kuò)展审残,這個(gè)特性在Linux內(nèi)核中應(yīng)用非常廣泛梭域。