我想在swift中创建一个指向self的弱指针,就像我们过去在objective-c之类的中一样
__weak Something *weakself = self;
我发现有人在解释如何在区块内使用"软弱的自我",
{ in [unowned self] ...}
但我不想在我的区块内定义"weakself",我想在区块外定义weakselve
只需用weak
关键字定义一个弱引用:
weak var weakSelf = self
来自文件:
通过将
weak
关键字放在属性或变量声明
注意:弱引用必须声明为变量,以表明它们的值可以在运行时更改。弱引用不能声明为常量。
在我看来,你正试图避免像在Objective-C中那样使用块来避免保留循环,在Objective-C中,你没有引用self,而是创建了一个弱版本:
__weak MyType *weakSelf = self;
void (^aBlock)() = ^void()
{
[weakSelf doStuff];
}
Swift不是这样处理这个问题的。
相反,它有一个捕获列表的概念,告诉编译器哪些引用了块捕获,以及如何处理它。你应该在Swift编程参考书中搜索"捕获列表",然后阅读这个主题。引用这本书:
"如果将闭包分配给类实例的属性,并且闭包通过引用实例或其成员,您将在闭包之间创建一个强引用循环以及实例。Swift使用捕获列表来打破这些强参考周期。有关更多信息,请参阅强参考周期关闭。">
摘录自:苹果股份有限公司"Swift编程语言"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