如何在块外快速创建指向自身的弱指针

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 是撒旦的杰作。

以上是关于如何在块外快速创建指向自身的弱指针的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Haskell 中的弱指针缓存构建具有重复消除的无限树

如何定义包含指向自身的指针的 typedef 结构?

关于指针的一些注意事项

Django:在块外带有标签

Oracle在块内是如何组织和管理数据的

如何快速获取指向视图控制器的全局指针