Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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_Memory Leaks_Automatic Ref Counting_Retain Cycle - Fatal编程技术网

Swift 通过使用函数参数类型避免弱引用?

Swift 通过使用函数参数类型避免弱引用?,swift,memory-leaks,automatic-ref-counting,retain-cycle,Swift,Memory Leaks,Automatic Ref Counting,Retain Cycle,我有一个函数,它接受一个块作为参数。我可以使用尾随闭包传递代码块,但在保留self时,该闭包必须使用weak引用 例如,请参见MyClass2的初始值设定项: class MyClass { func subscribe(using block: @escaping () -> Void) { DispatchQueue.global().async { block() } } } let test = MyClas

我有一个函数,它接受一个块作为参数。我可以使用尾随闭包传递代码块,但在保留
self
时,该闭包必须使用
weak
引用

例如,请参见
MyClass2
的初始值设定项:

class MyClass {
    func subscribe(using block: @escaping () -> Void) {
        DispatchQueue.global().async {
            block()
        }
    }
}

let test = MyClass()

class MyClass2 {

    var someProperty = 0

    init() {
        // Weakly referenced
        test.subscribe { [weak self] in
            self?.update()
        }
    }

    func update() {
        self.someProperty += 1
    }
}

MyClass2()
但是,如果我像这样将闭包作为函数参数传入,是否仍然需要这样做

class MyClass2 {

    var someProperty = 0

    init() {
        // Avoid retain cycle?
        test.subscribe(using: update)
    }

    func update() {
        self.someProperty += 1
    }
}

你的问题的整个前提(“但闭包必须使用弱引用”)是错误的。在你的第一个代码中从来没有任何理由使用
弱自我
。这是完全合理的:

init() {
    test.subscribe {
        self.update()
    }
}
需要使用
弱self
的原因是引用
self
的闭包本身被
self
保留,导致保留周期;但这在这里并没有发生