在 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