这不是另一个关于[weak self]
的问题。这是关于使用未包含在 self
中的变量,而是由包装函数包含的变量。
func someFunction(){
someOtherFunction(completionBlock:{ [weak self] in
self?.doStuff()
})
}
据我所知,我需要 [weak self]
来防止保留循环。
但是如果我需要使用包装函数中的变量怎么办,如下所示:
func someFunction(){
let someVariable = MyObject()
someOtherFunction(completionBlock:{ [weak self] in
self?.doStuff(with: someVariable)
})
}
这行得通,这让我想知道.. someVariable
如何在内存中保存多长时间?它可以在我的完成 block 强烈引用本地 someVariable
的地方创建自己的微小保留周期吗?他们将如何被释放? 我应该在 block 中添加[weak self, weak someVariable]
吗?但是,someVariable
不会在我调用 someOtherFunction
后立即释放吗,因为它是这个函数的结尾 - 也是 someVariable
的结尾'一生..?
我无法完全理解引用,看不到我的 completionBlock
和 someVariable
将如何被释放。 block 是否被释放?
最佳答案
闭包内引用的任何变量都将被该闭包强烈保留。您可以通过包含一个闭包捕获列表(例如[weak self]
)来调整它,它允许您指定在闭包中捕获的引用的特定内存管理模式。
func someFunction(){
let someVariable = MyObject()
someOtherFunction(completionBlock:{ [weak self] in
self?.doStuff(with: someVariable)
})
}
如您所述,这里,someVariable
由闭包保留。在这种情况下,它必须是,因为没有其他人关心它。正如您在评论中提到的,如果您使用 [weak someVariable]
的捕获列表,那么在执行完成 block 时它将始终为 nil,因为它已经超出了其原始功能的范围。
没有创建“微小的保留周期”。保留循环必须是一个循环 - 也就是说,A 持有对 B 的强引用,B 持有对 A 的强引用。someVariable
没有对任何内容的引用.
一旦 someOtherFunction
完成了对完成闭包的引用,一切都会消失。就 someOtherFunction
而言,闭包只是另一个变量,只要在范围内,它就会存在。
我应该弱化 block 中使用的“局部”变量吗? - 不,因为当 block 开始使用它们时它们将变为 nil。
关于ios - 我应该弱化 block 中使用的 "local"变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50060439/