如何在Swift中创建一个指向自身的弱引用,而非在块内部

23

我想在Swift中创建一个弱引用指向自己,就像我们在Objective-C中使用的方式一样。

 __weak Something *weakself = self;

我发现有人解释如何在代码块内使用“弱引用”。

    { in [unowned self] ...}

但我不想在我的代码块内定义 'weakself',我希望在代码块外部定义 weakself。


2
如果不是在块/闭包的上下文中,你需要什么样的“弱引用”来引用自身呢?例如,如果你想要一个委托属性是弱引用,你只需要声明它为弱引用即可(例如:weak var delegate: MyProtocol! 或其他)。 - Rob
@Rob说得很有道理。如果self不存在,那么在一个对象的方法中运行代码的情况是什么上下文呢?你需要一个对象来运行方法。 - rickster
2个回答

66

只需使用weak关键字定义弱引用:

weak var weakSelf = self

根据文档

通过在属性或变量声明之前放置 weak 关键字,表示一个弱引用。
...
注意:必须将弱引用声明为变量,以表示它们的值可以在运行时更改。不能将弱引用声明为常量。


这行代码比Objective-C中的还好看,谢谢! :) - Bob de Graaf

9

我觉得你试图避免在块中出现保留循环,就像在Objective-C中一样,你不是引用self,而是创建一个弱版本:

__weak MyType *weakSelf = self;

void (^aBlock)() = ^void()
{
   [weakSelf doStuff];
}

这不是Swift解决此问题的方式。相反,它有一个捕获列表的概念,告诉编译器块捕获了哪些引用以及如何处理它们。您应该在Swift编程参考书中搜索“Capture List”并详细阅读。引用该书的话:“如果您将闭包分配给类实例的属性,并且该闭包通过引用实例或其成员来捕获该实例,则会在闭包和实例之间创建强引用循环。 Swift使用捕获列表来打破这些强引用循环。 有关更多信息,请参见闭包的Strong Reference Cycles。”摘自:Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/us/jEUH0.l

2016年1月4日编辑:

引用Swift书中解释如何创建捕获列表的部分:
定义捕获列表:捕获列表中的每个项目都是弱引用或无主引用关键字与对类实例(例如self)或变量初始化为某个值(例如delegate = self.delegate!)的引用配对。这些配对写在一对方括号内,用逗号分隔。如果提供了闭包的参数列表和返回类型,请将捕获列表放置在其前面。
lazy var someClosure: (Int, String) -> String = 
{
    [unowned self, weak delegate = self.delegate!] 
    (index: Int, stringToProcess: String) -> String in
    // closure body goes here
}

摘自:苹果公司。“Swift编程语言(Swift 2)。” iBooks。https://itun.es/us/jEUH0.l


谢谢 Duncan。该文档也在这里。请查找“解决闭包的强引用循环”。 - Ferran Maylinch
1
我喜欢Swift比克林贡领域上的任何其他语言都要简单得多。/s> Swift是撒旦的杰作。 - Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接