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]当我刚刚传递实例方法时它是否已被考虑?
不幸的是,传递一个实例方法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)