ios - 我应该弱化 block 中使用的 "local"变量吗?

标签 ios swift

这不是另一个关于[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 的结尾'一生..?

我无法完全理解引用,看不到我的 completionBlocksomeVariable 将如何被释放。 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/

相关文章:

arrays - 为什么我不能让这个 2D 数组正确加载到我的自定义 CollectionViewCells 中?

ios - 每次保存新数据时 Plist 都会重写旧数据

ios - 从概念上讲,子类化 UIView 是否正确?

ios - 应用内购买实现

swift - 如何在 NSURLSession 中使用 PUT 方法向 HTTPBody 添加数据?

ios - 使用 Firebase (Swift) 按姓名或电子邮件地址查询用户

ios - 使用下拉刷新将背景 View 向下移动 - swift

iphone - 核心数据 : any way to fetch multiple entities?

ios - iOS:核心数据-我需要保存更改吗?

ios - Uber API 沙箱请求状态未正确更新