这是我的代码:

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()
    }
}

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

最佳答案

在类A中,您将委托定义为弱委托。这意味着,如果没有其他对象引用委托对象(在您的例子中是类b的实例),则可以释放此实例。
在运行开始时,类B的实例被某个对象引用。在这个类B中,您创建了类A实例,并将类B实例指定为其委托。
当您打印委托值时,它不是零。
后来,类B的实例不再被类A实例旁边的其他对象引用。由于类A实例将其称为弱实例,因此其引用不计数,实例A已从内存中释放。这就是为什么在一秒钟后打印委托值时它为零的原因。
为什么要用弱者?
如果不使用弱实例,则类A实例将保留对类B实例的引用,而类B实例将保留对类A实例的引用。这样,两个实例的引用计数都将大于0,并且它们都不能被释放!!!!这将导致内存泄漏。您需要的是,如果没有其他对象引用B类对象,它将从内存中释放,因此A类对象也可以释放。

关于swift - 快速授权 - 何时使用弱引用,为什么'委托(delegate)'是零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34611873/

10-17 01:10