Objective c Swift数组是否保留其元素?

Objective c Swift数组是否保留其元素?,objective-c,swift,retain-cycle,Objective C,Swift,Retain Cycle,我正在移植objective-c框架的一部分,在这里我有自己定制的MyNotificationCenter类,用于观察 该类有一个NSArray类型的属性,其中包含对通知感兴趣的所有可观察对象 在objective-c中,数组保留其元素,这是不必要的,因为当中心试图通知观察者时,观察者可能不再存在,并且您不希望有保留周期 因此,我使用了这段代码,它保留了数组中的所有项,而不保留它们: _observers = CFBridgingRelease(CFArrayCreateMutable(NULL

我正在移植objective-c框架的一部分,在这里我有自己定制的MyNotificationCenter类,用于观察

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

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

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

_observers = CFBridgingRelease(CFArrayCreateMutable(NULL, 0, NULL)); 
我知道Swift是另一种野兽,但是Swift中有这样的概念吗?

是的,Swift数组保留了它们的元素 让我们定义一个简单的类

class Foo {
    init() {
        print("Hello!")
    }
    deinit {
        print("Goodbye...")
    }
}
现在让我们试试这个代码

var list = [Foo()]
print(1)
list.removeAll()
这是输出

Hello!
1
Goodbye...
正如您所见,Foo对象将保留在内存中,直到它从数组中删除

Swift中可能的解决方案
您可以在Swift中创建自己的
WeakArray
struct,其中每个元素都被包装到一个类中,并带有对该元素的弱引用。然后将类对象插入数组中

是,Swift中的
数组
对象保留其元素。 从:

SWIFT的数组类型被桥接到基金会的NSlar类。

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

阅读Objective代码,您想要实现的是拥有一个不保留元素的类似NSArray的类。这也可以通过以下另一种方式实现:


NSHashTable与普通NSSet具有几乎相同的接口(NSHashTable是以NSSet为模型的),因此您应该能够用NSHashTable值替换NSArray值,只需稍作更改。

NSHashTable的可能副本更像是一个
NSSet
,而不是一个
NSArray
;我认为这只是一个打字错误。
NSHashTable *array = [NSHashTable weakObjectsHashTable];