我想像我们过去在objective-c中所做的那样,快速地为self创建一个弱指针
__weak Something *weakself = self;
我发现有人在解释如何在块内使用“弱自我”,
{ in [unowned self] ...}
但我不想在我的块内定义'weakself',我想在块外定义weakself
只需使用weak
关键字定义弱引用:
weak var weakSelf = self
从文档中:
您可以通过将
weak
关键字放在属性或变量声明之前来指示弱引用。
...
注意:弱引用必须声明为变量,以表明它们的值可以在运行时改变。弱引用不能声明为常量。
在我看来,您正试图避免像在 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
引用 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