|
|
@@ -41,6 +41,9 @@ struct WeakObjectSet<T: AnyObject>: Sequence {
|
|
|
}
|
|
|
|
|
|
mutating func add(_ object: T) {
|
|
|
+ // Registration doubles as the reaping hook — dead boxes are removed nowhere
|
|
|
+ // else, and most observers never unregister explicitly.
|
|
|
+ compact()
|
|
|
// prevent ObjectIdentifier be reused
|
|
|
if contains(object) {
|
|
|
remove(object)
|
|
|
@@ -48,6 +51,11 @@ struct WeakObjectSet<T: AnyObject>: Sequence {
|
|
|
objects.insert(WeakObject(object))
|
|
|
}
|
|
|
|
|
|
+ /// Drops entries whose weakly-held object has been deallocated.
|
|
|
+ mutating func compact() {
|
|
|
+ objects = objects.filter { $0.object != nil }
|
|
|
+ }
|
|
|
+
|
|
|
mutating func add(_ objects: [T]) {
|
|
|
objects.forEach { self.add($0) }
|
|
|
}
|