- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是一个使用 ReactiveSwift 的 Swift 类,将 MutableProperty
包装在 Property
中,并在 中添加对该
:Property
的订阅>ScopedDisposable
class Leaker {
let mutableProperty = MutableProperty<Int>(0)
var wrapperProperty: Property<Int> {
return Property(self.mutableProperty)
}
private var disposable: ScopedDisposable<AnyDisposable>?
init() {
let disposable = CompositeDisposable()
disposable += self.wrapperProperty.producer
.startWithValues { value in
print("\(value)")
}
self.disposable = ScopedDisposable(disposable)
}
}
如果我给另一个类一个 Leaker?
类型的属性,然后使用 self.leaker = Leaker()
设置它,这会造成泄漏。我所说的“造成泄漏”是指它触发了 Leaks 工具,显示了一个标记为 Malloc 32 Bytes
的泄漏对象,以及包含 Leaker.init()
的堆栈跟踪调用 Leaker.wrapperProperty.getter
。
为什么会泄漏?我发现很难准确理解是什么导致此处分配的内存永远不会被释放。
其他一些可能有用的事实:
mutableProperty
,这不会泄漏mutableProperty
包装在惰性属性而不是计算属性中,这不会泄漏Leaker
,这不会泄漏,例如让 _ = Leaker()
最佳答案
我试过了,但无法重现内存泄漏。我在这段代码中使用了你的 Leaker
类:
final class OtherClass {
let leaker: Leaker?
init() {
self.leaker = Leaker()
}
}
var otherClass: OtherClass? = OtherClass()
var mutablePropertyCompleted = false
otherClass!.leaker!.mutableProperty.producer.startWithCompleted {
mutablePropertyCompleted = true
}
var wrappedPropertyCompleted = false
otherClass!.leaker!.wrapperProperty.producer.startWithCompleted {
wrappedPropertyCompleted = true
}
otherClass = nil
if(!mutablePropertyCompleted) {
print("LEAK")
}
if(!wrappedPropertyCompleted) {
print("LEAK")
}
需要注意的一件事是 MutableProperty
在它的 deinit
方法中发送了 completed
,所以应该可以像我这样检测泄漏在这里做了。
但为了确定,我还使用未检测到任何内容的内存泄漏工具对此进行了概要分析。
既然你提到了一些特定的情况,在这些情况下这不会对你造成泄漏,这可能只是我尝试重现问题的方式是错误的,也许你可以发布一个完整的例子?
无论如何,我在您发布的示例中没有看到错误,所以这要么是 ReactiveSwift 中的错误,要么是探查器的误报(正如 jjoelson 在他的评论中指出的那样,ReactiveSwift 之前已经发生过这种情况)
关于ios - 为什么在属性中包装 ReactiveSwift MutableProperty 会导致泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680349/
是否有任何简单的方法可以在 Swift ReactiveCocoa 4 中从 MutableProperty 创建 MutableProperty? 我有一个案例,我想要一种用 classA 创建 c
我正在尝试在 View 模型中声明一个属性,稍后我将绑定(bind)到 View 。 class LoginViewModel { let myProperty = MutablePro
作为 this 的后续问题,收到 this fantastic answer ,并使用以下示例... class Model { let mapType = MutableProperty(.
我有一个“DataManager”单例类,它使用 RAC3 处理我的应用程序的状态。它包含多个 MutableProperty这是我在不同地点开始和观察的。 我想让我的 DataManager 启动或
我正在使用 RAC4 开发一个应用程序,它从服务器获取城市对象列表并将它们作为 JSON 返回。我通过将每个城市及其适当的属性存储为 City 对象来处理响应。然后,我将每个城市映射到 CityVie
我正在使用 ReactiveSwift 创建一个包含字典的结构。我想听字典的变化。 struct Model { let a: MutableProperty = MutablePropert
这是一个使用 ReactiveSwift 的 Swift 类,将 MutableProperty 包装在 Property 中,并在 中添加对该 Property 的订阅>ScopedDisposab
如何将 UITextView 的文本属性绑定(bind)到 MutableProperty,例如 let property = MutableProperty("") commentTextView.
所以我最近开始尝试将 ReactiveSwift 合并到我的项目中,但我似乎无法弄清楚为什么当我尝试使用 (nil) bodyManager = BodyManager() let bodyDetai
我的项目有 CoreData 数据库,其中包含 1 个根上下文和多个子上下文。我有一个包含项目 (NSManagedObject) 的 ViewModel。当我更改项目中的某些内容时,会在根上下文中进
它们有什么区别?您能否举例说明我应该在哪种情况下使用动态/可变/任意/常量属性? 最佳答案 所有答案都在这个链接Property.swift 我举几个例子: let privatString = Mu
我是一名优秀的程序员,十分优秀!