var label1: UILabel? = UILabel()

weak var label2 = label1

label1 = nil

这里有些混乱:
在这3行之后,label1为nil,但是label2仍然具有引用。根据我的理解,它应该为零,因为它很弱,因此不会牢牢掌握参考。

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

另一个问题:
func request() { [weak self] complete in
    guard let strongSelf = self else { return }
    strongSelf.printSomething()
    strongSelf.doSomething()
}

在Internet请求回调中,我指定了弱的self,并保护有一个strongSelf,以确保如果没有释放self,它将成功。问题是,当守卫后的防线跑开时,自我被释放到其他地方,strongSelf还会存活吗?它对自我有很强的控制力吗? (将+1引用计数添加到self,所以self的内存不会被释放?)

最佳答案

使用游乐场,请尝试以下操作:

class Node {}

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

UILabel的行为有所不同,因为正如Paulw11所暗示的那样,PlaygroundPage本身保留了UILabel

关于ios - swift 的弱引用困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47425347/

10-10 17:03