Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法引用使对象在Swift中保持活动状态_Swift_Automatic Ref Counting - Fatal编程技术网

方法引用使对象在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) =

我注意到,对对象方法的一些引用创建了对该对象的强引用,并使其在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) = 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],则会得到完全相同的行为。