Понимание UnsafeRawPointer в objc_setAssociatedObject - PullRequest
0 голосов
/ 11 января 2020

Я бы хотел установить n количество связанных объектов для объекта в Swift

Насколько я понимаю, обычный шаблон для ссылки UnsafeRawPointer выглядит следующим образом ...

static var reference = "someRef"

public func add(to myObject: AnyObject) {
    let adding = ThingToAdd()        
    objc_setAssociatedObject(myObject, &reference, adding, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

но это не сработает для n количества вызовов на add(to:)

Аналогично, приведенный ниже код работает нормально, если я вызываю его только один раз за myObject .. Однако, если я добавить другой связанный объект таким же образом ... он заменяет первый ThingToAdd вторым. Построение уникальной строки в строке не работает. На симуляторе все хорошо, но на устройстве это не так.

public func add(to myObject: AnyObject) {

    let adding = ThingToAdd()
    var reference = "objectref\(UUID().uuidString)".replacingOccurrences(of: "-", with: "")

    objc_setAssociatedObject(myObject, reference, adding, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

}

Я понимаю, что это неверно, однако я не знаю, как создать n число UnsafeRawPointers для хранения связанные объекты с уникальными ссылками.

Любая помощь / объяснение будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 января 2020

Передача reference в key: UnsafeRawPointer аргумент objc_setAssociatedObject передает адрес хранилища переменных в эту функцию.

Глобальные переменные и stati c переменные-члены ( и только те) гарантированно имеют фиксированный адрес.

В вашей первой версии второй и все последующие вызовы objc_setAssociatedObject с тем же ключом заменяют предыдущую связь.

Во второй версии адрес локальной переменной передается как ключ. Этот адрес может совпадать или не совпадать при последующих вызовах. Обратите внимание, что содержимое строки не имеет значения, ключ - это просто указатель, то есть адрес этой переменной.

Если вам нужно связать число переменных значений с данным объектом тогда я бы предложил связать один NSMutableArray (или NSMutableDictionary) и добавить значения в этот массив или словарь.

...