swift中使用閉包的時候如果存在循環(huán)引用聚蝶,可以采用下列幾種方式:
一、在閉包前使用 weak var weakSelf = self(注意weakSelf是var修飾的籍凝,因為weakSelf釋放的時候需要置為nil鉴竭,所以需要var修飾),然后在閉包內(nèi)部使用weakSelf烈和,但是使用weakSelf的使用是一個可選類型,需要加上?执解。
二、在閉包內(nèi)關(guān)鍵詞 in 前面使用加上[weak self] 纲酗,代表閉包內(nèi)部所有的self都是若引用衰腌,然后在閉包內(nèi)部直接使用self即可。對象釋放的時候觅赊,會將self置為nil右蕊,這個也是swift推薦寫法,很多第三方都這么寫的吮螺。對應(yīng)oc中的__weak typeof(self) weakSelf = self饶囚。
三帕翻、另外一個寫法是[unowned self],類似于[weak self]坯约,也表示閉包中所有的self都是assign的熊咽,不會強(qiáng)引用,但是對象釋放闹丐,指針地址不會變化横殴,繼續(xù)調(diào)用的話,就會出現(xiàn)野指針卿拴,不安全衫仑,但是如果能自己管理其內(nèi)存的話,可以使用堕花,性能效率比[weak self]好文狱,但是一般還是推薦寫[weak self]。對應(yīng)oc中的 __unsafe_unretained typeof(self) weakSelf = self缘挽。
注意:
在使用上面2種方法的時候瞄崇,weakSelf有可能因為閉包內(nèi)部延遲執(zhí)行、網(wǎng)絡(luò)請求延遲等等導(dǎo)致weakSelf提前釋放壕曼,可以在閉包內(nèi)部再“強(qiáng)引用下weakSelf”苏研。進(jìn)入閉包后,加上如下代碼腮郊,方法一摹蘑、二寫法如下:
使用一:let strongSelf = weakSelf;
使用二:let strongSelf = self;