如何在一个块之外的swift中创建一个弱指针

时间:2015-04-19 21:13:28

标签: swift closures block weak

我想快速制作一个指向自我的弱指针,就像我们在Objective-c中所使用的那样

 __weak Something *weakself = self;

我找到了解释如何使用弱自我的人。在一个街区内,

    { in [unowned self] ...}

但我不想定义“弱自己”。在我的块中,我想在块之外定义弱自己

2 个答案:

答案 0 :(得分:53)

只需使用weak关键字定义弱引用:

weak var weakSelf = self

来自documentation

  

您可以通过将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

2016年1月4日编辑:

引用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