2017-01-08 1 views
0

Я использую Swift 3 с ARC в приложении iOS, и я хочу вручную сохранить объект.Как сохранить вручную в Swift с ARC?

Я попробовал object.retain(), но Xcode говорит, что он недоступен в режиме ARC. Есть ли альтернативный способ сделать это, чтобы рассказать Xcode, я знаю, что я делаю?


Long Version:

У меня есть класс LocationTracker, который регистрирует себя в качестве делегата в CLLocationManager. Когда местоположение пользователя изменяется, оно обновляет статическую переменную с именем location. Другие части моего кода, которым требуется местоположение, получают доступ к этой статической переменной, не имея или не нуждающихся в ссылке на экземпляр LocationTracker.

Проблема с этим дизайном заключается в том, что делегаты не сохраняются, поэтому LocationTracker освобождается от времени, когда CLLocationManager отправляет ему сообщение, в результате чего происходит сбой.

Я хотел бы вручную увеличить коэффициент пересчета LocationTracker, прежде чем устанавливать его в качестве делегата. Объект никогда не будет освобожден в любом случае, так как местоположение должно контролироваться до тех пор, пока приложение работает.

Я нашел обходное решение, которое должно иметь статическую переменную «экземпляр», которая содержит ссылку на LocationTracker. Я считаю этот дизайн неэлегантным, так как я никогда не буду использовать переменную «instance». Могу ли я избавиться от него и явно увеличить коэффициент пересчета?

Этот вопрос не является дубликатом, как утверждалось, поскольку other question посвящен Objective-C, в то время как этот вопрос относится к Swift.

+0

Возможный дубликат [Ручное время жизни объекта с ARC] (http://stackoverflow.com/questions/10489995/manual-object-lifetime-with-arc) – CRD

+0

Не дубликат. Я отредактировал вопрос, чтобы сказать, почему. –

+0

Я думаю, вы найдете ряд представленных решений, которые применимы к Swift по отношению к Objective-C. Попробуйте попробовать, и вы можете найти подходящее для вас решение. HTH – CRD

ответ

0

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

Существуют различные способы реализации того, что вы делаете, но нет способа вызвать retain под ARC.

+0

Даже в небезопасном коде? –

+0

Я понятия не имею, что вы подразумеваете под небезопасным кодом. – rmaddy

+0

Способ вручную взять под контроль refcounts, как указывает Крис Лэттнер в http://atp.fm/episodes/205. –

Смежные вопросы