Vapor Hello 示例中的强引用

Strong reference in Vapor Hello sample

在玩 Vapor Hello 示例 (https://docs.vapor.codes/3.0/getting-started/hello-world/) 时,我遇到了这个:

public func routes(_ router: Router) throws {
    ...
    let todoController = TodoController()
    router.get("todos", use: todoController.index)
    router.post("todos", use: todoController.create)
    router.delete("todos", Todo.parameter, use: todoController.delete)
}

正如我们在这里看到的,todoController 是一个全局 routes 函数的局部变量。并且它应该在离开它的范围后立即被释放,因为对它的引用没有传递到任何地方。对成员的引用已通过,但根据我的理解水平,这不是 ARC 的工作方式。但是,todoController 在整个程序执行期间都处于活动状态。这里的技巧在哪里?

todoController.index 是一个捕获 self 的闭包,它持有对 todoController.

的强引用

只要 router 注册了这些 get/post/delete 处理程序,todoController 就会持续存在。