variable strong extension arc swift dealloc

extension - strong variable swift



dealloc en Swift (4)

Tenga cuidado al llamar a un método en otra clase desde el inicio , probablemente terminará en un accidente.

Me gustaría realizar algunas tareas de limpieza al final de la vida de un controlador de visualización, es decir, eliminar una notificación de NSNotificationCenter . Implementando los resultados dealloc en un error del compilador Swift:

Cannot override ''dealloc'' which has been marked unavailable

¿Cuál es la forma preferida de realizar una limpieza al final de la vida de un objeto en Swift?


https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

Swift automáticamente desasigna sus instancias cuando ya no son necesarias, para liberar recursos. Swift maneja la administración de la memoria de las instancias mediante el recuento automático de referencias (ARC), como se describe en el recuento automático de referencias. Por lo general, no es necesario realizar una limpieza manual cuando se desasignan sus instancias. Sin embargo, cuando trabaje con sus propios recursos, es posible que necesite realizar una limpieza adicional usted mismo. Por ejemplo, si crea una clase personalizada para abrir un archivo y escribirle algunos datos, es posible que deba cerrar el archivo antes de desasignar la instancia de la clase.

Las definiciones de clase pueden tener como máximo un desinicializador por clase. El desinicializador no toma ningún parámetro y se escribe sin paréntesis:

deinit { // perform the deinitialization }


deinit { // perform the deinitialization }

De la documentación de Swift :

Se llama a un desinicializador inmediatamente antes de desasignar una instancia de clase. Usted escribe desinicializadores con la palabra clave deinit, similar a cómo se escriben los intializadores con la palabra clave init. Los desinicializadores solo están disponibles en los tipos de clase.

Por lo general, no es necesario realizar una limpieza manual cuando se desasignan sus instancias. Sin embargo, cuando trabaje con sus propios recursos, es posible que necesite realizar una limpieza adicional usted mismo. Por ejemplo, si crea una clase personalizada para abrir un archivo y escribirle algunos datos, es posible que deba cerrar el archivo antes de desasignar la instancia de la clase.


deinit { // perform the deinitialization }

es la respuesta correcta para Swift "dealloc".

Sin embargo, es bueno destacar que en iOS 9 ya no es necesario limpiar NSNotificationCenter.

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#X10_11Notes

NSNotificationCenter

En OS X 10.11 y iOS 9.0, NSNotificationCenter y NSDistributedNotificationCenter ya no enviarán notificaciones a los observadores registrados que puedan ser desasignados. Si el observador puede almacenarse como una referencia débil a cero, el almacenamiento subyacente almacenará al observador como una referencia débil a cero, alternativamente si el objeto no puede almacenarse débilmente (es decir, tiene un mecanismo de retención / liberación personalizado que evitaría el tiempo de ejecución de poder almacenar el objeto débilmente) almacenará el objeto como una referencia de reducción a cero no débil. Esto significa que los observadores no están obligados a anular el registro en su método de desasignación. La próxima notificación que se enrutará a ese observador detectará la referencia a cero y anulará el registro automático del observador. Si se puede hacer referencia débilmente a un objeto, las notificaciones ya no se enviarán al observador durante la desasignación; el comportamiento anterior de recibir notificaciones durante dealloc todavía está presente en el caso de observadores de referencia que no reducen a cero. Los observadores basados ​​en bloques a través del método - [NSNotificationCenter addObserverForName: object: queue: usingBlock] aún deben ser desregistrados cuando ya no estén en uso, ya que el sistema aún mantiene una fuerte referencia a estos observadores. Aún se admite la eliminación prematura de observadores (ya sea de referencia débil o referencia cero). CFNotificationCenterAddObserver no se ajusta a este comportamiento ya que el observador puede no ser un objeto.

pero tenga en cuenta los puntos a continuación acerca de las referencias sólidas, por lo que puede tener que preocuparse por la limpieza de todos modos ...?