#ios #swift #objective-c #closures #objective-c-blocks
Вопрос:
У меня есть свойство блока в файле Objective C .h. Я создаю переменную контроллера Objective C в файле swift с помощью этого кода
let viewController = ViewController(nibName: "ViewController", bundle: nil)
viewController.onCellPressed = { [weak self] cellModel in
guard let cellModel = cellModel else { return }
self?.openDetails(cellModel)
}
Вот объявление блока var
@property (nonatomic, copy) void (^onCellPressed)(CellModel* model);
И я запускаю этот блок с помощью этого кода
self.onCellPressed([_photos objectAtIndex:indexPath.row]);
Проблема в том, что [weak self]
внутри
{ [weak self] cellModel in
guard let cellModel = cellModel else { return }
self?.openDetails(cellModel)
}
это всегда nil
Как использовать слабую самость внутри блока в файле swift?
Комментарии:
1. Этот квартал вообще называется? Видя только код как таковой, я задаюсь
viewController
вопросом, не слишком ли скоро будет выпущен локальный var.2. Да, он зовет. Этот контроллер создан в координаторе, поэтому он должен находиться в памяти. Кроме того, в случае, если я использую сильную самость внутри блока, это работает так, как я ожидаю
3. «Этот контроллер создан в координаторе, поэтому он должен быть в памяти» Это зависит от того, хранится ли координатор тоже в памяти? Разве это тоже не местный вар? У вас есть воспроизводимый пример приложения?
4. Было бы полезно, если бы вы могли поделиться выполняемым кодом для тестирования.