如何在块外快速创建指向自身的弱指针
Posted
技术标签:
【中文标题】如何在块外快速创建指向自身的弱指针【英文标题】:how to make a weak pointer to self in swift outside of a block 【发布时间】:2015-06-26 11:22:33 【问题描述】:我想在 swift 中创建一个指向 self 的弱指针,就像我们过去在 Objective-c 中所做的那样
__weak Something *weakself = self;
我发现有人在解释如何在块中使用“弱自我”,
in [unowned self] ...
但我不想在我的块内定义'weakself',我想在块外定义weakself
【问题讨论】:
在什么情况下你需要weak
引用self
,如果不是在块/闭包的上下文中?例如,如果您希望 delegate
属性较弱,您只需将其声明为这样(例如 weak var delegate: MyProtocol!
或其他)。
@Rob 有一个很好的观点。如果self
不存在,在什么情况下可以运行对象方法之一中的代码?你需要一个对象来运行方法。
【参考方案1】:
只需使用 weak
关键字定义弱引用:
weak var weakSelf = self
来自documentation:
您可以通过将
weak
关键字放在 属性或变量声明。 ... 注意:弱引用必须声明为变量,以表明它们的值可以在运行时改变。弱引用不能声明为常量。
【讨论】:
这行代码实际上比 Objective-C 中的更好看。谢谢! :)【参考方案2】:在我看来,您试图避免像在 Objective-C 中那样使用块的保留循环,而不是引用 self,而是创建一个弱版本:
__weak MyType *weakSelf = self;
void (^aBlock)() = ^void()
[weakSelf doStuff];
这不是 Swift 处理这个问题的方式。
相反,它有一个捕获列表的概念,它告诉编译器哪些引用了块捕获,以及如何处理它。您应该在 Swift Programming Reference book 中搜索“Capture List”并阅读该主题。引用本书:
“如果你将闭包分配给类实例的属性,并且 闭包通过引用实例或其 成员,您将在闭包之间创建一个强引用循环 和实例。 Swift 使用捕获列表来打破这些强大的 参考周期。有关详细信息,请参阅强引用循环 用于闭包。”
摘自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l
2016 年 1 月 4 日编辑:
引用 Swift 书中解释如何创建捕获列表的部分:
定义捕获列表:捕获列表中的每个项目都是一对 引用类实例的弱或无主关键字(例如 as self) 或使用某个值初始化的变量(例如 delegate = 自我代表!)。这些配对写在一对正方形内 大括号,用逗号分隔。
将捕获列表放在闭包的参数列表之前并返回 如果提供,请键入:
lazy var someClosure: (Int, String) -> String =
[unowned self, weak delegate = self.delegate!]
(index: Int, stringToProcess: String) -> String in
// closure body goes here
摘自:Apple Inc. “Swift 编程语言 (Swift 2)”。电子书。 https://itun.es/us/jEUH0.l
【讨论】:
谢谢邓肯。该文档也是here。寻找“解决闭包的强引用循环”。 我喜欢 swift 比克林贡领域的任何其他语言都简单得多。 /s> Swift 是撒旦的杰作。以上是关于如何在块外快速创建指向自身的弱指针的主要内容,如果未能解决你的问题,请参考以下文章