gpt4 book ai didi

memory - 在 RxSwift 闭包上使用 'self' ...实例方法作为参数怎么样?

转载 作者:行者123 更新时间:2023-12-01 22:20:20 24 4
gpt4 key购买 nike

other stack overflow questions ,强调捕获 [weak self] 应该用于不属于该类的闭包,因为 self 在闭包完成之前可能为 nil。当闭包由类本身拥有时,另一种选择是 [unowned self]

我的问题是当我作为参数传递的函数是当前类的实例方法时,我是否需要使用[unowned self]

例子

import RxSwift

class Person {
var name = "Default name"

class func getPersons() -> Observable<Person> {
// ...
}


}

class MyController: UIViewController {
let disposeBag = DisposeBag()

// I know this right
func unownedDisplayPeople() {

Person.getPersons()
.subscribeNext { [unowned self ] person in
self.displayName(person)
}
.addDisposableToBag(disposeBag)
}

// But what about this?
func whatAboutThisDisplayPeople() {

Person.getPersons()
.subscribeNext(displayName)
.addDisposableToBag(disposeBag)
}

// Or this?
func orThisDisplayPeople() {

Person.getPersons()
.subscribeNext(self.displayName)
.addDisposableToBag(disposeBag)
}

func displayName(person: Person) {
print("Person name is \(person.name)")
}
}

如果我只是传递一个实例方法时还需要考虑引用计数,我该怎么办?我应该把 [unowned self] 放在哪里?或者当我刚刚传递实例方法时它是否被认为是[unowned self]

最佳答案

不幸的是,将实例方法传递给 subscribeNext 保留self。更通用地说,存储对实例方法的引用将增加实例的保留计数。

let instance = ReferenceType()
print(CFGetRetainCount(instance)) // 1

let methodReference = instance.method
print(CFGetRetainCount(instance)) // 2

此处唯一的解决方案是按照您在 unownedDisplayPeople 中所做的操作。

let instance = ReferenceType()
print(CFGetRetainCount(instance)) // 1

let methodReference = { [unowned instance] in instance.method() }
print(CFGetRetainCount(instance)) // 1

关于memory - 在 RxSwift 闭包上使用 'self' ...实例方法作为参数怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com