在RxSwift闭包上使用'self'......作为param的实例方法怎么样?

iwi*_*not 2 memory retaincount retain-cycle swift2 rx-swift

其他堆栈溢出问题中,强调捕获[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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

tom*_*ahh 7

不幸的是,传递一个实例方法subscribeNext 保留self.更通用的是,存储对实例方法的引用将增加实例的保留计数.

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

let methodReference = instance.method
print(CFGetRetainCount(instance)) // 2
Run Code Online (Sandbox Code Playgroud)

这里唯一的解决方案是做你做过的事情unownedDisplayPeople.

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

let methodReference = { [unowned instance] in instance.method() }
print(CFGetRetainCount(instance)) // 1
Run Code Online (Sandbox Code Playgroud)