Weak Strong Dance

HUA YU TSENG
1 min readMar 12, 2020

objc

__weak WeakStrongDance_objcViewController *wself = self;/*
// 無weak-strong-dance狀況
self.completionHandler = ^(NSString *returnResult) {
if (wself != nil) { // 這行時mVC可能存在,通過檢查
wself.myObjcString = @"new"; // 可能已經是nil,KVO時造成crash
}
};
*/
// 實作weak-strong-dance
// 做一次強引用,將若引用的指針賦值給強引用的指針,(sself 強引用 wself 指向的物件)
//如此,指向對象的引用計數變成2,即使主線程中的self因為超出作用域被釋放了,該對象的引用計數仍為1,避免該對象被銷毀。
self.completionHandler = ^(NSString *returnResult) {
__strong __typeof (wself) sself = wself;
sself.myObjcString = @"new";
};
//Q:block 內部定義了sself,會不會因此強引用sself?//A:不會。block 只有在截獲外部變量時才會引用他,像上述在內部新建一個,則沒有任和問題。self.completionHandler = { [weak self] result in
if let `self` = self { // swift 的 weak strong dance
self.mySwiftString = ""
}
}

swift

self.completionHandler = { [weak self] result in
if let `self` = self { // swift 的 weak strong dance
self.mySwiftString = ""
}
}

--

--

HUA YU TSENG

I am Red, an iOS developer, I have hands on experience in iOS, Flutter, familiar with RxSwift Moya Unit/UI testing and Gitlab-CI.