首先我們來對比一下Swift下函數(shù)和閉包的區(qū)別
Swift的閉包和OC里面的block是非常相似的吠撮,作用是用于保存一段代碼, 在需要的時候執(zhí)行
OC: block類似于匿名函數(shù), 用于封裝代碼塊, 在特定的時候執(zhí)行
類型: 返回值類型(^block名稱)(形參列表)
值:
^(形參列表){
需要執(zhí)行的代碼
}
Swift: 閉包是用于定義函數(shù)(Swift中函數(shù)就是閉包, 閉包就是一個特殊的函數(shù))
類型: (形參列表)->返回值類型
值:
{
(形參列表)->返回值類型
in
需要執(zhí)行的代碼
} // in 的含義是用于區(qū)分形參返回值和執(zhí)行代碼
當OC的block遇到循環(huán)引用的時候,我們會用__weak typeof(self) weakSelf = self 或者 __unsafe_unretained 來解決
區(qū)別:
//? ? __weak? : 如果對象釋放, 會自動設(shè)置為nil
//? ? __unsafe_unretained: 如果對象釋放, 不會自動設(shè)置為nil
Swift閉包中會使用強引用self兜辞,跟OC的block一樣會出現(xiàn)循環(huán)引用的問題