Realm Objects永远不会被释放,因此app因内存而不可避免地崩溃。 (记忆管理)

时间:2017-01-20 23:01:43

标签: swift memory-management memory-leaks realm automatic-ref-counting

你想达到什么目的?

UIViewController deinit被称为 - 0内存泄漏

预期结果

释放了Realm对象,因此引用count = 0并允许uiviewcontrollerdeinit

实际结果

Realm对象从未被释放,标准的内存崩溃,因为没有uiviewcontrollers被取消初始化。

重现步骤

创建一些对象模型,其主要模型包含这些对象的实例。将数据解析为主模型的初始化程序内的可选对象模型。这应该会给你这些结果。

代码示例

这是我正在使用的标准对象(有更多变量,但这只是一个例子)

class FullData: Object {
    dynamic var venueType: VenueType?
    dynamic var travelerType: TravelerType?

    dynamic var owner: ProfileData?

    let keywords = List<NewKeywords>()
    let cuisines = List<NewCuisines>()
    let images = List<Images>()
}

在此模型的convenience初始化中,我将使用一个函数创建一个新的VenueType实例,并将该新实例分配给模型中的可选变量。

  fileprivate func parseVenueType(_ dictionary: NSDictionary) {
        let venues = VenueType()
        dictionary.forEach { (key, val) in
            let keyString = key as! String
            let value = val as! Bool
            switch keyString {
            case "Bar":
                if value == true {
                    venues.bar = true
                }
                break
            case "Restaurant":
                if value == true {
                    venues.restaurant = true
                }
                break
            case "Cafe":
                if value == true {
                    venues.cafe = true
                }
                break
            default:
                break
            }
        }
        venueType = venues
    }

以下是VenueTypeTravelerType类设置类

的方式
class VenueType: Object {
        dynamic var cafe = false
        dynamic var bar = false
        dynamic var restaurant = false
    }
    class TravelerType: Object {
        dynamic var single = false
        dynamic var couple = false
        dynamic var group = false
        dynamic var family = false
    }

使用Leaks中的Instruments工具,我发现有大量泄漏,所有这些都与此几乎完全相同。创建一个对象的新实例以分配给模型中的对象。

以下是一些详细说明这些泄漏的图片。

我在我的应用中创建了Objects的新实例,以用作模型,但99.99%的时间我不会持久保存我正在创建的模型。我使用这些作为基本模型来填充单元格等。理论上,它们应该在完成后被释放。

我真的不确定我做错了什么,因为我的所有泄漏都是因为Realm Objects。几乎好像我用于数据的所有模型都没有在离开视图控制器时被释放。

我应该手动执行此操作吗?我已经阅读了一些关于autoreleasepools和realm.invalidate的评论,但我不确定这是否适合我的情况。

当我创建一个Object实例以分配给另一个Object中的变量时 - 我是否需要做一些特别的事情来确保它正确解除分配?

非常感谢你的帮助。

Full Leak Trace

Leak line

retain/release cycles

Trace for leak

0 个答案:

没有答案