[unowned self]
面試題:請說出工作中遇到的迴圈引用(不要說沒有遇到過)class
viewcontroller: uiviewcontroller
}func
loaddata
(completion: ()->()) -> ()}}
// 析構函式 - 類似於 oc 的 dealloc
deinit
}
方法一
// 1. 方法一,類似於 oc 的方法
// * weak 修飾的變數有可能在執行時被修改為 nil,因此不能使用 let
weak
var weakself = self
loaddata
方法二
// 2. 方法二,swift 的寫法
// [weak self] 表示閉包中的 self 是弱引用,如果 self 被釋放,會自動設定為 nil
// 與 oc 的 `__weak` 等效
loaddata
方法三 —— 知道就行
// 3. 方法三
// [unowned self] 表示閉包中的 self 是 assign 的,如果 self 被釋放,指標位址保持不變
// 會出現野指標的錯誤
// 與 oc 的 `__unsafe_unretained` 等效
loaddata
@inte***ce
demoviewcontroller ()
@property (weak, nonatomic) iboutlet
uilabel *tiplabel;
@property (nonatomic, copy) void (^completionblock)();
@end
@implementation
demoviewcontroller
- (void)viewdidload ];
// 方法二:使用 __unsafe_unretained 解除迴圈引用,一旦 self 被釋放,會報野指標錯誤
__unsafe_unretained typeof(self) weakself = self;
[self loaddatawithcompletion:^];
}- (void)loaddatawithcompletion:(void (^)())completion );
});}- (void)dealloc
@end
swift 閉包迴圈引用的解決辦法
模擬網路請求,封裝工具類,使用閉包變數對閉包進行強引用 networkrequesttool.swift test created by fe on 2017 2 28.import uikit class networkrequesttool nsobject 在控制器中呼叫工具類,在閉包內使用s...
Swift中閉包的迴圈引用及改正
迴圈引用的產生原因 兩個物件互相之間強引用,導致互相不能釋放,後果就是兩個物件都不釋放,導致兩個物件的記憶體都不能釋放,這就會產生所謂的記憶體洩露。swift閉包迴圈引用產生的兩個條件 1.物件對閉包強引用,即閉包是物件的屬性。2.閉包中對物件強引用,閉包對閉包中的成員變數都會強引用一次。stude...
閉包返回函式不引用迴圈變數
def count fs for i in range 1,4 def f return i i return fs f1,f2,f3 count print f1 9 print f2 9 print f3 9 全部都是9 原因就在於返回的函式引用了變數i,但它並非立刻執行。等到3個函式都返回時,...