Swift,闭包捕获了多少 "self"?

标签 swift closures

我对这种情况感到困惑:

  1. A 类将转义闭包 Z 交给某个全局队列。

  2. 在闭包 Z 中,我们调用 A 类中的 funcs,以及仅从 A 类中引用的 B 类。

  3. 就在闭包 Z 调用类 B 的函数之前,类 B 被清除。

  4. 此时类 B 对闭包 Z 意味着什么?它仍然是捕获时的旧 B 还是新的 nil? (假设 B 是代表)

==

另一个后续问题是,如果闭包 Z 调用的类 B 的函数引用了类 B 中的更多东西,那么 B 的“ self ”是如何捕获的,它是强的还是弱的?

我的困惑来自于在闭包 Z 中,我可以指定 [weak self],但我不能为我想在类 B 中调用的函数这样做。

最佳答案

class B who is only referenced from class A.

我假设你在 A 中的意思是这样的:

var objB: B?

Just before closure Z calls functions from class B, class B gets cleaned out.

那么,只有一种方法可以清除 B:

objB = nil

现在,当您在闭包中调用 B 的方法时,您将得到“在展开可选值时意外发现 nil”。

这是因为你在闭包中只捕获了self,也就是A。您根本没有捕获 BB 的实例由来自A 的强引用保留。基本上,B 不会被闭包捕获。

My confusion comes because in closure Z, i can specify [weak self], but I cannot do that for the functions I want to call in class B.

不过,您可以捕获B。就像这样:

[b = self.objB] in ...

你也可以让它变弱:

[weak b = self.objB] in ...

这样你也可以在闭包中捕获 B。

关于Swift,闭包捕获了多少 "self"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047768/

相关文章:

swift - 没有可访问的初始化器,Swift Singleton

ios - 在 iOS 上的 Safari 共享扩展中获取 SLComposeServiceViewController 中的 URL

ios - 从 String 到 Date() 转换的日期(转换后日期不正确)swift

javascript - 闭包 javascript 调用

arrays - 快速将对象添加到静态数组

c# - 闭包行为

javascript - 模块模式中的简单闭包示例不起作用

C++ Lambda - 错误 : no matching function for call to

c++ - 在 C++ 中用作闭包的函数指针

OpenWeather API 的 JSON 结果集未返回 Swift 中主词典的值