比方说,我有一个weak var view: UIView?
在我的class Button {}
.有什么方法可以知道什么时候view
失去它的参考并成为nil
?
我尝试使用weak var view: UIView? {}
(也称为计算属性)以覆盖set {}
,但这不起作用,因为现在它是一个计算属性,不能存储弱引用(多么烦人!).
编辑:
@fqdn的答案无法使用此代码...在Xcode Playground中尝试
import UIKit
class Test {
weak var target: UIView? {
willSet {
if !newValue { println("target set to nil") }
else { println("target set to view") }
}
}
}
class Button {
var view: UIView? = UIView()
}
var t = Test()
var b = Button()
t.target = b.view
b.view = nil // t.target's willSet should be fired here
Run Code Online (Sandbox Code Playgroud)
您的输出控制台应显示:
target set to view
target set to nil
Run Code Online (Sandbox Code Playgroud)
我的控制台显示
target set to view
Run Code Online (Sandbox Code Playgroud)
b.view
是UIView实例的强引用.t.target
是弱参考.因此,如果b.view
设置为nil
,则取消分配UIView实例t.target
并将等于nil.
Wol*_*lly 13
如果你的按钮持有对另一个视图的引用,它应该是该视图的所有者(即,它应该具有强引用),或者当该视图消失时它不应该关心(即,它对它的弱引用变为零) .)当弱引用变为零时,没有通知,这是设计的.
特别是,当弱引用变为nil时,不会调用Swift属性观察器,如下面的代码所示:
class A : CustomStringConvertible {
var s: String?
init(s: String) {
self.s = s;
print("\(self) init")
}
deinit {
print("\(self) deinit")
}
var description: String {
get { return "[A s:\(s ?? "nil")]" }
}
}
class B : CustomStringConvertible {
weak var a:A? {
willSet {
print("\(self) willSet a")
}
didSet {
print("\(self) didSet a")
}
}
init(a: A?) {
self.a = a
print("\(self) init")
}
deinit {
print("\(self) deinit")
}
var description: String {
get { return "[B a:\(a == nil ? "nil" : String(describing: a!))]" }
}
}
func work() {
var a: A? = A(s: "Hello")
var b = B(a: a)
print("\(b)")
a = nil
print("\(b)")
b.a = A(s: "Goodbye")
}
work()
Run Code Online (Sandbox Code Playgroud)
当work()
被调用时,控制台提供了以下的输出:
[A s:Hello] init
[B a:[A s:Hello]] init
[B a:[A s:Hello]]
[A s:Hello] deinit
[B a:nil]
[A s:Goodbye] init
[B a:nil] willSet a
[B a:[A s:Goodbye]] didSet a
[A s:Goodbye] deinit
[B a:nil] deinit
Run Code Online (Sandbox Code Playgroud)
请注意,在A取消分配的实例和在B变为nil的实例中的弱引用都不是被调用的属性观察者.只有在分配给Ba的直接情况下才被称为.
归档时间: |
|
查看次数: |
7337 次 |
最近记录: |