如何在块外的swift中使弱指针指向self



我想在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

相关内容

  • 没有找到相关文章

最新更新