【问题标题】:Swift weak reference confusionSwift 弱引用混淆
【发布时间】:2017-11-22 01:16:45
【问题描述】:
var label1: UILabel? = UILabel()

weak var label2 = label1

label1 = nil

这里有一些困惑: 在这 3 行之后,label1 为 nil,但 label2 仍然有引用。根据我的理解,它应该是 nil ,因为它很弱,所以它不会对引用有很强的把握。

那么,为什么这不起作用?

另一个问题:

func request() { [weak self] complete in
    guard let strongSelf = self else { return }
    strongSelf.printSomething()
    strongSelf.doSomething()
}

在互联网请求回调中,我指定了弱自我,并保护有一个强自我,以确保如果自我没有被释放,它会成功。问题是,如果当守卫之后的线路运行时,self 被释放到其他地方,strongSelf 还活着吗?它对自我有很强的把握吗? (给 self 添加 +1 引用计数,所以 self 的内存不会被释放?)

【问题讨论】:

  • 您是否已将标签添加到视图中?如果是这样,视图将持有对它的强引用,因此 label2 不会是nil。在回答您的其他问题时,是的 strongSelf 将阻止对象被释放
  • @Paulw11 不,我在 Playground 中进行了第一次测试,只有 3 行代码。标签不会插入到任何视图中。关于第二个答案,是不是说strongSelf给弱self加了引用计数+1就可以了?
  • 你不能相信操场上会有这种东西。在真正的应用中测试它
  • @Paulw11 实际上我确实在实际项目中尝试过,仍然给出相同的结果..
  • @paulw11 实际上,你是对的,只是做了一些测试以使其工作

标签: ios swift memory closures block


【解决方案1】:

使用游乐场,试试这个:

class Node {}

var node1: Node? = Node()
weak var node2 = node1
node1 = nil
print(node2 ?? "node2 is nil!")

UILabel 的行为不同,因为正如 Paulw11 所建议的,它被 PlaygroundPage 本身保留

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多