【问题标题】:Swift NSBlockOperation() Leak: cannot make NSBlockOperation() weakSwift NSBlockOperation() 泄漏:不能使 NSBlockOperation() 变弱
【发布时间】:2016-04-19 22:42:29
【问题描述】:

为了避免在 Objective-C 中使用 NSBlockOperation 时发生内存泄漏,我们必须将变量声明为 weak 以便能够引用块内的块操作(如果需要可以取消),通常像这样:

__weak NSBlockOperation *blockOp  = [NSBlockOperation blockOperationWithBlock:^{
     if (blockOp.cancelled) {
         ...
     }
}];

但是在 Swift 中,当我尝试将我的 NSBlockOpeartion 声明为弱时,它总是为零。

weak var blockOp = NSBlockOperation()

没有弱引用,一切都很好,只是每次都会泄漏一点内存。如何在 Swift 中引用块内的块而不泄漏内存?

【问题讨论】:

  • 如果强引用为零,弱引用会自动归零....
  • 您在 Obj-C 中通常会遇到完全相同的问题。

标签: swift memory-management nsoperation nsblockoperation


【解决方案1】:

您可以使用显式捕获列表来捕获对操作的无主引用。 (这是我实际上建议使用无主引用的唯一一次,因为只要它的块正在执行,该操作就会被保留。如果您仍然对该保证感到不舒服,您可以使用 weak 代替。)

let op = NSBlockOperation()
op.addExecutionBlock { [unowned op] in
    print("hi")
    if op.cancelled { ... }
}

注意这里必须分成两行,因为变量不能从它自己的初始值引用。

【讨论】:

  • 这似乎适用于第一次测试。我想我更喜欢弱,但是就像我在帖子中提到的那样,当我声明它为弱时,我在尝试使用 NSBlockOperation() 分配它时得到 nil,就像你说它必须分成两行,所以我不不知道怎么分配它。
  • 你可以像使用[unowned op]一样使用[weak op]
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 2012-06-16
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多