2016-01-05 41 views
2

这里是我的代码:迅捷授权 - 何时使用弱引用,为什么'委托'是零?

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

我搜索了关于堆栈溢出的其他问题,但我无法找到的东西,可以帮助我充分理解这种情况。

+3

看看这个:http://stackoverflow.com/questions/34608397/why-is-the-uitabbarcontrollerdelegate-nil-right-after-i-set-it/34608887,也许这是一个类似的情况。 – courteouselk

回答

2

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

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

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

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

相关问题