Вызов блока Objective C в быстром слабом я всегда равен нулю

#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. Было бы полезно, если бы вы могли поделиться выполняемым кодом для тестирования.