use*_*076 18 closures block weak swift
我想像我们在Objective-c中所习惯的一样快速地指向自我
__weak Something *weakself = self;
Run Code Online (Sandbox Code Playgroud)
我找到人们解释如何在一个街区内使用"弱自我",
{ in [unowned self] ...}
Run Code Online (Sandbox Code Playgroud)
但是我不想在我的块中定义'weakself',我想在块之外定义弱自己
Mar*_*n R 56
只需使用weak关键字定义弱引用:
weak var weakSelf = self
Run Code Online (Sandbox Code Playgroud)
从文档:
通过将
weak关键字放在属性或变量声明之前来指示弱引用.
...
注意:弱引用必须声明为变量,以指示它们的值可以在运行时更改.弱引用不能声明为常量.
对我来说听起来像是在尝试像在Objective-C中一样避免使用块的保留周期,而不是引用self,而是创建一个弱版本:
__weak MyType *weakSelf = self;
void (^aBlock)() = ^void()
{
[weakSelf doStuff];
}
Run Code Online (Sandbox Code Playgroud)
这不是Swift处理这个问题的方式.
相反,它具有捕获列表的概念,它告诉编译器哪些引用块捕获,以及如何处理它.您应该在Swift编程参考书中搜索"捕获列表"并阅读相关主题.引用这本书:
"如果为类实例的属性分配闭包,并且闭包通过引用实例或其成员来捕获该实例,则将在闭包和实例之间创建一个强引用循环.Swift使用捕获列表来打破这些强大的参考周期.有关更多信息,请参阅闭包的强引用周期."
摘录自:Apple Inc."The Swift Programming Language."iBooks.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
}
Run Code Online (Sandbox Code Playgroud)
摘录自:Apple Inc."The Swift Programming Language(Swift 2)."iBooks.https://itun.es/us/jEUH0.l