当对象A具有对象B作为属性而对象B具有包含对象A的数组属性时,在Swift中保留循环?

时间:2015-06-12 00:11:43

标签: ios swift memory-management memory-leaks retain-cycle

对可能是保留周期的情况感到困惑?

我明白,如果

class Object-B {
    var a: Object-A
]

var a = Object-A()
var b = Object-B()
a.b = b
b.a = a

然后上面是可怕的设计,因为如果你做

class Object-A {
    var b: Object-B 
}

class Object-B {
    var randomArrayProperty: [Object-B]
}

然后这会导致一个保留周期,其中两个强引用相互指向。

但是如果情况如下呢?

var a = Object-A()
var b = Object-B()
a.b = a
b.randomArrayProperty.append(a)

你尝试做

ul
  each val in [1, 2, 3, 4, 5]
    li= val

这也是一个保留周期吗?

2 个答案:

答案 0 :(得分:1)

一般来说,通过手动引用计数和自动引用计数,引用 ilands 将泄漏。参考周期可以由不止两个对象组成。

那就是说我鼓励你在游乐场测试一些代码,因为你的问题中的例子有一些语法和语言错误。

以下代码可能是一个起点:

class ObjectA {
    let name: String
    var b: ObjectB

    init(name: String, b: ObjectB) {
        self.name = name
        self.b = b
    }

    deinit {
        print("\(name) deallocated")
    }
}

class ObjectB {
    let name: String
    var randomArrayProperty = [ObjectA]()

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) deallocated")
    }
}

// Create a _possible_ leak. It depends on what we'll do next
var b: ObjectB? = ObjectB(name: "Foo B")
var a: ObjectA? = ObjectA(name: "Bar A", b: b!)
b?.randomArrayProperty.append(a!)

// No leaks
a = nil
// Remove a from array inside b, a will dealloc
b?.randomArrayProperty.removeLast()
b = nil

// Recreate a _possible_ leak.
b = ObjectB(name: "Foo1 B")
a = ObjectA(name: "Bar1 A", b: b!)
b?.randomArrayProperty.append(a!)

// Leaks
a = nil
b = nil

然后继续玩变种; - )

希望这有帮助

答案 1 :(得分:0)

我想是这样,有一个保留周期。什么工具显示内存泄漏?