Preguntas
¿Por qué el deinit es nonisolated por defecto en Swift?
deinit se invoca en el momento exacto que el objeto es liberado de memoria. Tener un deinit aislado en el actor implicaría que el executor programe su ejecución:
- El executor programa la ejecución del
deinit - No se puede liberar el objeto porque no se ha llamado
deinit
¿Qué problema ocurre cuando intentas llamar un método aislado al actor desde un deinit?
Aparece el error:
// ❌ Call to actor-isolated instance method 'x()' in a synchronous nonisolated context
¿Qué significa que el deinit sea siempre sincrónico y por qué un deinit asíncrono sería problemático?
deinit se invoca al liberar el objeto de memoria. Si fuera asíncrono, esto extendería el tiempo de vida del actor.
¿Cómo soluciona isolated deinit el error del compilador?
El objeto no se libera sino hasta que el deinit termine de forma asíncrone, ejecutado en el executor del actor.
¿Por qué tardó tanto tiempo en implementarse esta funcionalidad en Swift (isolated deinit)?
Se propuso en 2022, pero se consideraba demasiado riesgosa.
¿Cuáles son los requisitos mínimos de sistema operativo para usar isolated deinit?
iOS 18.4+ y macOS 15.4+
¿Qué alternativas existían antes de isolated deinit para limpiar el estado de un actor?
Se debía invocar primero los métodos de limpieza de forma manual antes de soltar la referencia al objeto (esto provocaba el llamado al deinit síncrono).
¿Qué hace el actor FileDownloader en el ejemplo y por qué causa un error de compilación en su deinit?
Crea una tarea Task<Void,Error>. En deinit se invoca al método cancel() que limpia la instancia. Sin embargo, cancel() está aislado dentro del dominio del actor y por eso no se podía invocar desde el deinit sin await.
¿Qué significa que el deinit se ejecute en el executor del actor al usar isolated deinit?
El executor del actor garantiza que el cuerpo del deinit se ejecute en el contexto del actor de forma síncrona, permitiendo tener acceso al estado aislado.
Top comments (0)