我想快速制作一个指向自我的弱指针,就像我们在Objective-c中所使用的那样
__weak Something *weakself = self;
我找到了解释如何使用弱自我的人。在一个街区内,
{ in [unowned self] ...}
但我不想定义“弱自己”。在我的块中,我想在块之外定义弱自己
答案 0 :(得分:53)
只需使用weak
关键字定义弱引用:
weak var weakSelf = self
您可以通过将
weak
关键字置于a之前来表示弱引用 财产或变量声明 ...
注意:弱引用必须声明为变量,以指示它们的值可以在运行时更改。弱引用不能声明为常量。
答案 1 :(得分:8)
听起来像你正试图像在Objective-C中一样避免使用块的保留周期,而不是引用self,而是创建一个弱版本:
__weak MyType *weakSelf = self;
void (^aBlock)() = ^void()
{
[weakSelf doStuff];
}
这不是Swift处理这个问题的方式。
相反,它具有捕获列表的概念,它告诉编译器哪些引用块捕获,以及如何处理它。您应该在Swift编程参考书中搜索“捕获列表”并阅读相关主题。引用这本书:
“如果为类实例的属性分配闭包,则为 闭包通过引用实例或其实例来捕获该实例 成员,您将在闭包之间创建一个强大的引用循环 和实例。 Swift使用捕获列表打破这些强大 参考周期。有关更多信息,请参阅强引用循环 关闭。“
摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/us/jEUH0.l
引用Swift书中解释如何创建捕获列表的部分:
定义捕获列表:捕获列表中的每个项目都是一对 带有类实例引用的弱或无主关键字(例如 as 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)。”iBooks。 https://itun.es/us/jEUH0.l