前言
在不久前看AFNetworking的源碼時(shí)候發(fā)現(xiàn)了這么一句:
// 不知道這行代碼的使用場(chǎng)景的同學(xué)你該去自習(xí)看看ARC的注意事項(xiàng)和Block的使用了
// AFNetworking的寫(xiě)法
__weak __typeof(&*self)weakSelf = self;
// 我之前一直這么寫(xiě)的
__weak __typeof(self) weakSelf = self;
// 或者這么寫(xiě)
__weak XxxViewController *weakSelf = self;
// 或者這么寫(xiě)
__weak id weakSelf = self;
當(dāng)時(shí)也沒(méi)注意為什么要寫(xiě)成&*這種樣子… 今天再想起來(lái), 搜了一圈, 終于讓我找到原因了…
正文
其實(shí)以上的4種寫(xiě)法都是對(duì)的
AFNetworking里面不寫(xiě)成以上這行代碼的原因是因?yàn)?typeof(self) 會(huì)被解析成 XxxViewController *const __strong (假如你的self是XxxViewController的話), 這樣的話就就會(huì)報(bào)錯(cuò)…(沒(méi)有老版本, 沒(méi)有驗(yàn)證, 不過(guò)看網(wǎng)上的結(jié)論應(yīng)該是這樣了)
不過(guò), 如果你寫(xiě)成了__typeof(self)也沒(méi)什么問(wèn)題… 那是因?yàn)樵贚LVM3.1之后已經(jīng)不會(huì)出現(xiàn)以上的情況了… ( via )