在 RxSwift 闭包上使用 'self' ...实例方法作为参数怎么样?
Using 'self' on RxSwift closures... What about instance methods as param?
在 中,强调捕获 [weak self]
应该用于不属于 class 的闭包,因为 self
之前可能为 nil关闭完成。当闭包由 class 本身拥有时,另一种选择是 [unowned self]
.
我的问题是当我作为参数传递的函数是当前class的实例方法时,我是否需要使用[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
在 [weak self]
应该用于不属于 class 的闭包,因为 self
之前可能为 nil关闭完成。当闭包由 class 本身拥有时,另一种选择是 [unowned self]
.
我的问题是当我作为参数传递的函数是当前class的实例方法时,我是否需要使用[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