Swift数组是否保留了它们的元素?

时间:2016-10-18 14:45:22

标签: objective-c swift retain-cycle

我正在移植我的objective-c框架的一部分,我有自定义的MyNotificationCenter类用于观察目的。

该类具有NSArray类型的属性,其中包含对通知感兴趣的所有可观察对象。

在objective-c中,数组会保留其元素,这是不必要的,因为当中心尝试通知他时,观察者可能不再存在,并且您不希望保留周期。

因此我使用这段代码保留了数组中的所有项目而不保留它们:

<XmlArray("lines")> _
<XmlArrayItem("CalculatedLine", GetType(Lines.CalculatedLine))> _
<XmlArrayItem("PointLine", GetType(Lines.PointLine))> _
<XmlArrayItem("line", GetType(Lines.OldLine))> _ <<This needs to become PointLine when serialized.
Public Property lines As List(Of Lines.Line) = New List(Of Lines.Line)

我知道Swift是一个不同的野兽,但Swift中有这样的概念吗?

2 个答案:

答案 0 :(得分:2)

是的,Swift数组确实保留了它们的元素

让我们定义一个简单的类

class Foo {
    init() {
        print("Hello!")
    }
    deinit {
        print("Goodbye...")
    }
}

现在让我们试试这段代码

var list = [Foo()]
print(1)
list.removeAll()

这是输出

Hello!
1
Goodbye...

正如您所看到的,Foo对象将保留在内存中,直到从阵列中删除为止。

Swift中可能的解决方案

您可以在Swift中创建自己的WeakArray结构,其中每个元素都包含在一个对元素具有弱引用的类中。然后将类对象插入到数组中。

答案 1 :(得分:2)

是的,Swift中的Array对象保留了它的元素。 来自Apple Documentation

  

Swift的Array类型桥接到Foundation的NSArray类。

因此它具有与NSArray相同的行为。

阅读你的ObjectiveC代码,你想要实现的是拥有一个类似NSArray的类,它不会保留元素。这也可以使用NSHashTable

以另一种方式实现
NSHashTable *array = [NSHashTable weakObjectsHashTable];

NSHashTable具有与普通NSSet几乎相同的接口(NSHashTable在NSSet之后建模),因此您应该能够用NSHashTable值替换NSArray值并进行少量更改。