swift - 调用内部函数时保留循环?
swift - retain cycle when calling inner function?
当内部函数 progressComplete
在没有弱自我的情况下调用内部闭包并且在它内部 (progressComplete
) 我使用自我时,我是否有一个保留周期?
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
self.manager.requestData { success in
progressComplete(success)
}
}
}
最好使用 weak self 闭包,例如
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
// Use [weak self]
self.manager.requestData { [weak self] success in
self?.progressComplete(success)
}
}
}
Do I have a retain cycle
是的,从某种意义上说,您可能是认真的。 self
(SomeClass)保留了管理器,而管理器在调用 doSomething
后保留了回调方法 progressComplete
,它指的是 self
.
因此,这不是永久性情况(真正的泄漏),但在管理器的 requestData
执行回调之前,SomeClass 不会消失。通过实验很容易证实这一点,你可以在内存图中看到:
这不一定是坏事!但如果它会成为一个问题,那么你需要修复它。
但是请注意,weak self
在这里对您没有帮助,因为没地方说。您只能在 anonymous 函数的主体中说 weak self
— 而且您没有任何匿名函数!
因此,如果您担心的话,正确的编写方法是放弃单独的 progressComplete
函数并将回调编写为匿名函数,然后进行弱-强舞蹈,例如这个:
self.manager.requestData { [weak self] success in
if let self = self {
self.someVar = nil
completion?(success)
}
}
当内部函数 progressComplete
在没有弱自我的情况下调用内部闭包并且在它内部 (progressComplete
) 我使用自我时,我是否有一个保留周期?
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
self.manager.requestData { success in
progressComplete(success)
}
}
}
最好使用 weak self 闭包,例如
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
// Use [weak self]
self.manager.requestData { [weak self] success in
self?.progressComplete(success)
}
}
}
Do I have a retain cycle
是的,从某种意义上说,您可能是认真的。 self
(SomeClass)保留了管理器,而管理器在调用 doSomething
后保留了回调方法 progressComplete
,它指的是 self
.
因此,这不是永久性情况(真正的泄漏),但在管理器的 requestData
执行回调之前,SomeClass 不会消失。通过实验很容易证实这一点,你可以在内存图中看到:
这不一定是坏事!但如果它会成为一个问题,那么你需要修复它。
但是请注意,weak self
在这里对您没有帮助,因为没地方说。您只能在 anonymous 函数的主体中说 weak self
— 而且您没有任何匿名函数!
因此,如果您担心的话,正确的编写方法是放弃单独的 progressComplete
函数并将回调编写为匿名函数,然后进行弱-强舞蹈,例如这个:
self.manager.requestData { [weak self] success in
if let self = self {
self.someVar = nil
completion?(success)
}
}