Мой пользовательский подкласс UIViewController имеет сохраненное свойство закрытия. Сигнатура закрытия определяется как принимающая один аргумент того же типа класса:
class MyViewController {
var completionHandler : ((MyViewController)->(Void))?
// ...
}
... идея в том, что объект передает себя обратно в качестве аргумента обработчика, немного как инициализатор UIAlertAction.
Кроме того, для удобства у меня есть фабричный (-ish) метод класса:
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void)))
{
// ...
}
...который выполняет следующие действия:
- Создает экземпляр контроллера представления,
- Назначает обработчик завершения свойству,
- Представляет его модально из того, что во время вызова является контроллером верхнего/корневого представления.
Мой контроллер представления определенно дает утечку: я установил точку останова на deinit()
, но выполнение никогда не достигает ее, даже после того, как я закончил работу с моим контроллером представления, и он был отклонен.
Я не уверен, как и где я должен указать список захвата, чтобы избежать цикла. Каждый пример, с которым я сталкивался, кажется, размещает его там, где определено тело замыкания, но я не могу скомпилировать свой код.
Где я объявляю свойство закрытия? (как?)
var completionHandler : ((MyViewController)->(Void))? // If so, where does it go?
Где я объявляю параметр закрытия?
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void))) { // Again, where could it go?
Где я вызываю вышеуказанную функцию и передаю тело закрытия?
MyViewController.presentInstance(withCompletionHandler:{ [unowned viewController] viewController in // ... }) // ^ Use of unresolved identifier viewController // ^ Definition conflicts with previous value
Где я на самом деле вызываю закрытие, в сторону
self
? Ни один из них не будет компилироваться:self.completionHandler?(unowned self) self.completionHandler?([unowned self] self) self.completionHandler?([unowned self], self)