Сохраняют ли массивы Swift свои элементы?

Я переношу одну часть своей структуры Objective-C, где у меня был собственный класс MyNotificationCenter для целей наблюдения.

У класса было свойство типа NSArray со всеми наблюдаемыми, которые заинтересованы в уведомлениях.

В target-c массив сохраняет свои элементы, и в этом нет необходимости, потому что наблюдатель может больше не существовать в тот момент, когда центр пытается уведомить его, и вы не хотите иметь цикл сохранения.

Поэтому я использовал этот блок кода, который сохранял все элементы в массиве, не сохраняя их:

_observers = CFBridgingRelease(CFArrayCreateMutable(NULL, 0, NULL)); 

Я знаю, что Swift — это другой зверь, однако есть ли такая концепция в Swift?


person Centurion    schedule 18.10.2016    source источник
comment
Возможный дубликат Как объявить массив слабые ссылки в Swift?   -  person holex    schedule 18.10.2016


Ответы (2)


Да, объект Array в Swift сохраняет свои элементы. Из документации Apple:

Тип Swift Array связан с классом Foundation NSArray.

поэтому он ведет себя так же, как NSArray.

Читая ваш код ObjectiveC, вы хотите получить класс, подобный NSArray, который не сохраняет элементы. Этого можно добиться другим способом, используя NSHashTable:

NSHashTable *array = [NSHashTable weakObjectsHashTable];

NSHashTable имеет почти такой же интерфейс, как и обычный NSSet (NSHashTable создан по образцу NSSet), поэтому вы сможете заменить значение NSArray значением NSHashTable с небольшими изменениями.

person Marco Pace    schedule 18.10.2016
comment
NSHashTable больше похоже на NSSet, чем на NSArray; Я думаю, что это просто опечатка. - person holex; 18.10.2016

Да, массивы Swift сохраняют свои элементы

Давайте определим простой класс

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

А теперь давайте попробуем этот код

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

это результат

Hello!
1
Goodbye...

Как видите, объект Foo сохраняется в памяти до тех пор, пока он не будет удален из массива.

Возможное решение в Swift

Вы можете создать свою собственную структуру WeakArray в Swift, где каждый элемент заключен в класс со слабой ссылкой на элемент. Затем объект класса вставляется в массив.

person Luca Angeletti    schedule 18.10.2016