方法引用使对象在Swift中保持活动状态
我注意到,对对象方法的一些引用创建了对该对象的强引用,并使其在Swift中保持活动状态 有什么办法吗?是否可以将方法参考标记为弱方法引用使对象在Swift中保持活动状态,swift,automatic-ref-counting,Swift,Automatic Ref Counting,我注意到,对对象方法的一些引用创建了对该对象的强引用,并使其在Swift中保持活动状态 有什么办法吗?是否可以将方法参考标记为弱 class Counter { var n: Int = 0 func inc() -> Int { n += 1 return n } } var o: Counter? = Counter() weak var w: Counter? = o var c: () -> (Int) =
class Counter
{
var n: Int = 0
func inc() -> Int
{
n += 1
return n
}
}
var o: Counter? = Counter()
weak var w: Counter? = o
var c: () -> (Int) = o!.inc
c() // 1
w?.n
o = nil
c() // 2 - object is still alive here
w?.n // weak reference is also alive here
var c
不是对一个方法的引用,而是对一个方法包的引用,以及它需要操作的任何对象的引用。在您的例子中,方法inc
需要它的计数器
对象来完成它的工作,因此计数器
保持活动状态
闭包使其对象保持活动状态是一个基本特性。释放对象的唯一方法是显式释放对其实例方法的所有引用。您不能将闭包引用设置为弱,但可以将其设置为可选
class Counter
{
var n: Int = 0
func inc() -> Int
{
n += 1
return n
}
}
var o: Counter? = Counter()
weak var w: Counter? = o
var c: (() -> (Int))? = o?.inc //this is the crucial part
c?() // 1
w?.n
o = nil
c = nil
c?() //nil
w?.n //nil
这就是你想要做的吗?
我注意到金属样本应用程序在结尾处有一个弱引用
class Counter
{
var n: Int = 0
func inc()
{
n += 1
print("new count \(n)")
}
deinit {
print("deinit")
}
}
var counter: Counter? = Counter()
var closure: () -> () = {
[weak counter] in
if let strongRef = counter {
print("alive")
strongRef.inc()
} else {
print("dead")
}
}
closure()
counter = nil
closure()
这张照片
alive
new count 1
deinit
dead
谢谢,但这意味着我也必须将
c
设置为nil
。我想这是没有办法的。是的,这与我想要达到的目标非常接近。我担心OP会得出错误的结论。如果从该答案中删除中的[weak counter],则会得到完全相同的行为。