swift委托——什么时候使用弱引用,为什么'delegate'是nil?

swift delegation - when to use weak reference, why 'delegate' is nil?

这是我的代码:

protocol Delegate: NSObjectProtocol {}

class A: NSObject {
    weak var delegate: Delegate!
    override init() {
        super.init()
    }
    func start() {
        //synchronous------- print A: false
        print("A:", delegate == nil)

        //asynchronous------- print B: true  Why is 'true'? How can do that not be released?
        let time: NSTimeInterval = 1
        let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
        dispatch_after(delay, dispatch_get_main_queue()) {
            print("B:", self.delegate == nil)
        }
    }
}

class B: NSObject, Delegate {
    override init() {
        super.init()
        let a = A()
        a.delegate = self
        a.start()
    }
}

我搜索了有关堆栈溢出的其他问题,但找不到可以帮助我完全理解这种情况的内容。

在 class A 中,您将委托定义为。这意味着如果没有其他对象引用委托对象(在您的情况下是 class B 的实例),则可以释放此实例。

在 运行 的开头,class B 的实例被某个对象引用。在此 class B 中,您创建了 class A 实例,并将 class B 实例指定为其委托。 当您打印委托值时,它不是零。

后来,class B 实例不再被其他对象引用,除了 class A 实例。由于class一个实例引用它为weak,它的引用不算数,实例A被从内存中释放。这就是为什么当您在一秒钟后打印委托值时它是零。

为什么要用weak? 如果您不使用 weak,那么 class A 实例将持有对 class B 实例的引用,而 class B 实例将持有对 class A 实例的引用。这样两个实例的引用计数都将大于 0,并且 none 个实例可以被释放!!!这将导致内存泄漏。你想要的是,如果没有其他对象引用 class B 对象,它将从内存中释放,因此 class A 对象也可以被释放。