Представьте себе следующий сценарий, используя управление памятью вручную (иначе не-ARC):Слабый/Сильный «танец» в ручном управлении памятью
У меня есть VC, который проходит через блок к методу класса. Перед выполнением блока VC выдается из UINavigationController
. Слабая ссылка в форме __block MyVC *weakSelf = self
передается блоку, который затем преобразуется в MyVC *strongSelf = weakSelf
(он же слабый/сильный танец). Блок никогда не сохраняется ни одним из участников.
В этом случае, что я вижу в моем коде:
- dealloc из ВК вызывается, когда она выскочила.
- Блок в конечном итоге называется.
- Приложение вылетает из-за того, что я обращаюсь к мусору (
strongSelf
указывает на него).
Мой вопрос: я не хочу, чтобы мой VC оставался в живых до тех пор, пока блок в конечном счете не исполнится, но как только блок будет выполнен, я хочу подтвердить, что действителен strongSelf
.
Я проверил это (non-trivial example by Apple), который не работает, потому что он разработан с учетом ARC. Итак, как я могу иметь такое же поведение с MMM? В идеале я хочу иметь то, что делает __weak
: если retainCount
достигает нуля, я хочу, чтобы его ссылки указывали на ноль, а не на мусор.
После прочтения этого от Apple:
В некоторых случаях вы можете использовать __unsafe_unretained если класс не __weak совместимы. Это может, однако, стать непрактичным для нетривиальных циклов, потому что может быть трудно или невозможно проверить , что указатель __unsafe_unretained по-прежнему действителен и по-прежнему указывает на тот же объект.
Поскольку у меня нет доступа к __weak
, что я хочу сделать, это возможно?
@trojanfoe точка, которую он знает, если безопасно вызывать методы внутри блока. Если VC исчезнет, он потерпит крах, если он все еще существует, он будет работать, как ожидалось. – Peres
Вы можете делать то, что вы пытаетесь достичь, но это не тривиально. Я пишу ответ, поскольку пару лет назад я должен был решить эту проблему. Будьте на связи! –
@trojanfoe, если бы я сделал это, мне пришлось бы проверять всюду, если блок «NULL», прежде чем пытаться его выполнить. – Peres