22

我想像我们过去在objective-c中所做的那样,快速地为self创建一个弱指针

 __weak Something *weakself = self;

我发现有人在解释如何在块内使用“弱自我”,

    { in [unowned self] ...}

但我不想在我的块内定义'weakself',我想在块外定义weakself

4

2 回答 2

63

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

weak var weakSelf = self

文档中:

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

于 2015-04-19T21:19:57.813 回答
9

在我看来,您正试图避免像在 Objective-C 中那样使用块的保留循环,而不是引用 self,而是创建一个弱版本:

__weak MyType *weakSelf = self;

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

这不是 Swift 处理这个问题的方式。

相反,它有一个捕获列表的概念,它告诉编译器哪些引用了块捕获,以及如何处理它。您应该在 Swift Programming Reference book 中搜索“Capture List”并阅读该主题。引用这本书:

“如果你将闭包分配给类实例的属性,并且闭包通过引用实例或其成员来捕获该实例,那么你将在闭包和实例之间创建一个强引用循环。Swift 使用捕获列表来打破这些强引用循环。有关详细信息,请参阅闭包的强引用循环。”</p>

摘自:Apple Inc.“Swift 编程语言”。电子书。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
}

摘自:Apple Inc. “Swift 编程语言 (Swift 2)。” 电子书。https://itun.es/us/jEUH0.l

于 2015-04-19T21:53:00.283 回答