Как мне вручную сохранить в Swift с ARC?
Я использую Swift 3 с ARC в приложении для iOS и хочу сохранить объект вручную.
Я пробовал object.retain(), но Xcode говорит, что он недоступен в режиме ARC. Есть ли альтернативный способ сделать это, чтобы сообщить Xcode, что я знаю, что делаю?
Длинная версия:
У меня есть класс LocationTracker, который регистрирует себя как делегат CLLocationManager. Когда местоположение пользователя изменяется, оно обновляет статическую переменную с именем location. Другие части моего кода, которым требуется местоположение, обращаются к этой статической переменной, не имея ссылки на экземпляр LocationTracker или не нуждаясь в ней.
Проблема с этим дизайном состоит в том, что делегаты не сохраняются, поэтому LocationTracker освобождается, когда CLLocationManager отправляет ему сообщение, что вызывает сбой.
Я хотел бы вручную увеличить refcount LocationTracker перед установкой его в качестве делегата. В любом случае объект никогда не будет освобожден, так как местоположение должно отслеживаться в течение всего времени работы приложения.
Я нашел обходной путь, который должен иметь статическую переменную 'instance', которая хранит ссылку на LocationTracker. Я считаю этот дизайн не элегантным, поскольку я никогда не собираюсь использовать переменную instance. Могу ли я избавиться от него и явно увеличить счет?
Этот вопрос не является дубликатом, как было заявлено, поскольку другой вопрос касается Objective-C, а этот - о Swift.
3 ответа
Оказалось, что решением было включить retain() и release():
extension NSObjectProtocol {
/// Same as retain(), which the compiler no longer lets us call:
@discardableResult
func retainMe() -> Self {
_ = Unmanaged.passRetained(self)
return self
}
/// Same as autorelease(), which the compiler no longer lets us call.
///
/// This function does an autorelease() rather than release() to give you more flexibility.
@discardableResult
func releaseMe() -> Self {
_ = Unmanaged.passUnretained(self).autorelease()
return self
}
}
Это легко сделать с withExtendedLifetime(_:_:)
функция. Из документации:
Оценивает замыкание, гарантируя, что данный экземпляр не будет уничтожен до возврата замыкания.
Ура!
В рамках ARC единственное решение - хранить где-то сильную ссылку. Ваша текущая реализация на самом деле является лучшим решением. Позвольте вашему классу отслеживания местоположения сохранять свою собственную ссылку на себя, чтобы гарантировать, что он остается.
Есть разные способы реализовать то, что вы делаете, но нет способа позвонить retain
под ARC.