我正在移植我的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中有这样的概念吗?
答案 0 :(得分:2)
让我们定义一个简单的类
class Foo {
init() {
print("Hello!")
}
deinit {
print("Goodbye...")
}
}
现在让我们试试这段代码
var list = [Foo()]
print(1)
list.removeAll()
这是输出
Hello!
1
Goodbye...
正如您所看到的,Foo对象将保留在内存中,直到从阵列中删除为止。
您可以在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值并进行少量更改。