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 对象也可以被释放。
这是我的代码:
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 对象也可以被释放。