将方法传递给需要闭包的函数时,我可以在self.someMethod()中使用someFunc(closure: someMethod) or
someFunc(){[unowned self]}``。向函数传递方法时避免强引用
第一个较短,但有很强的参考价值。我怎样才能使用它,同时避免这个强烈的参考?
下面是两个泄漏一个良好的一个演示: https://swiftlang.ng.bluemix.net/#/repl/581ccd3a0bdc661a6c566347
import Foundation
private var instanceCounter = 0
class Leak : NSObject {
override init() {
super.init()
instanceCounter += 1
}
deinit {
instanceCounter -= 1
}
}
class OnFunctionLeak : Leak {
override init() {
super.init()
_ = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "OnFunctionLeak"),
object: nil,
queue: nil,
usingBlock: doNothing)
}
func doNothing(_ notif: Notification) { }
deinit {
NotificationCenter.default.removeObserver(self)
}
}
class OnClosureLeak : Leak {
override init() {
super.init()
_ = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "OnFunctionLeak"),
object: nil,
queue: nil) { [unowned self] notif in
self.doNothing(notif)
}
}
func doNothing(_ notif: Notification) { }
deinit {
NotificationCenter.default.removeObserver(self)
}
}
var onFunctionLeak: OnFunctionLeak? = OnFunctionLeak()
onFunctionLeak = nil
//XCTAssertEqual(instanceCounter, 0)
print("instanceCounter: \(instanceCounter) == 0")
instanceCounter = 0
var onClosureLeak: OnClosureLeak? = OnClosureLeak()
onClosureLeak = nil
//XCTAssertEqual(instanceCounter, 0)
print("instanceCounter: \(instanceCounter) == 0")
较短的选择是26行,如果我通过{ [unowned self] notif in self.doNothing(notif) }
更换doNothing
,强引用消失了。
任何想法?
相关:[如何从方法中删除强关联循环?](http://stackoverflow.com/q/39899051/2976878)我不相信有一个更好的方法可以避免强烈提及“自我” '不使用闭包,例如在第二个例子中。 – Hamish
我读过它,我要求确定。但是,如果它得到证实,我的想法就是为什么允许直接写出这个问题,如果它总是会创建一个隐藏的强参考,那么容易犯这个错误。 – Dam
顺便说一句,调用“NotificationCenter.default.removeObserver(self)”通常被认为是不好的做法 - 这可能会弄乱父类,所以Apple鼓励你逐个删除你的观察结果。 –