Memory 使用';自我';关于RxSwift闭包。。。作为param的实例方法呢?

Memory 使用';自我';关于RxSwift闭包。。。作为param的实例方法呢?,memory,swift2,rx-swift,retain-cycle,retaincount,Memory,Swift2,Rx Swift,Retain Cycle,Retaincount,在中,强调了捕获[weak self]应该用于不属于类的闭包,因为在闭包完成之前self可能为零。当闭包由类本身拥有时,另一种选择是[unowned self] 我的问题是,当作为参数传递的函数是当前类的实例方法时,是否需要使用[unowned self] 例子 导入RxSwift 班主任{ var name=“默认名称” 类func getPersons()->可观察{ // ... } } 类MyController:UIViewController{ 设disposeBag=dispose

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

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

例子
导入RxSwift
班主任{
var name=“默认名称”
类func getPersons()->可观察{
// ...
}
}
类MyController:UIViewController{
设disposeBag=disposeBag()
//我知道这是对的
func unownedDisplayPeople(){
Person.getPersons()
.subscribeNext{[无主自我]个人
self.displayName(个人)
}
.addDisposableToBag(disposeBag)
}
//但是这个呢?
func whatAboutThisDisplayPeople(){
Person.getPersons()
.subscribeNext(显示名称)
.addDisposableToBag(disposeBag)
}
//还是这个?
职能或显示人员(){
Person.getPersons()
.subscribeNext(self.displayName)
.addDisposableToBag(disposeBag)
}
func displayName(个人:个人){
打印(“人名为\(Person.name)”)
}
}

如果我在传递一个实例方法时仍然需要考虑引用计数,我该怎么做?我应该把
[无主自我]
放在哪里?或者,当我刚刚传递实例方法时,它是否已经被认为是
[无主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

谢谢你澄清这一点。我只是被语法所困扰,因为它看起来一点也不漂亮(但我想我必须用它来防止内存泄漏。是的,我也讨厌它。也许有一种方法我们可以创建一个
subscribeWeaklyNext
版本的
subscribeNext
,它不会改变保留计数……所以,我在swift游乐场里摆弄了一下,撞了一堵墙。关闭不能像这样做
weaklyNext
)它只适用于类和类绑定协议。我猜self是在函数调用(接受闭包)之前捕获的。似乎我们被这种“非最佳”语法困住了:/其他阅读:相关:如何使用-
let instance = ReferenceType()
print(CFGetRetainCount(instance)) // 1

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