ios objective-c selector

iOS: ".cxx_destruct"-un selector oculto en mi clase



objective-c (1)

Antes de ARC, los desarrolladores tendrían que escribir deliberadamente una rutina de dealloc para asegurar que todas las referencias a todos los objetos que retenían fueran liberadas. Este fue un trabajo manual y propenso a errores.

Cuando se introdujo el código ARC que realiza una tarea equivalente, ya que estos lanzamientos manuales deberían implementarse en cada objeto que poseía algo más que propiedades simples. Confiar en un desarrollador que implemente manualmente una rutina de dealloc anularía.

Nota : Esto es solo para fines de gestión de conteo de referencia cuando se destruyen objetos. Si necesita eliminar observadores o realizar otro trabajo de limpieza, entonces todavía necesitará una rutina de dealloc .

Como resultado, se utilizó el mecanismo preexistente de .cxx_destruct -c ++, a saber, un selector oculto llamado .cxx_destruct que se invoca automáticamente justo antes de que el objeto sea desasignado. Este selector es invocado automáticamente por el tiempo de ejecución de Objective C.

Para el código C ++ de Objective, hay un .cxx_construct paralelo para la construcción.

Nuevamente, estos son generados automáticamente por el compilador para tratar con la destrucción de objetos en el contexto ARC. Puede ver que se crea si compila algún código C objetivo simple con y sin una propiedad de objeto. Toma este código de muestra:

#import <Foundation/Foundation.h> @interface Foo : NSObject @property (strong) NSObject *anobject; @end @implementation Foo @end int main() { Foo *f = [[Foo alloc] init]; return 0; }

Cuando clang -fobjc-arc test.m -o test -framework foundation con ARC ( clang -fobjc-arc test.m -o test -framework foundation ) y volcamos la información de clase, vemos un selector de .cxx_destruct , cuando .cxx_destruct sin ARC ( clang -fnoobjc-arc test.m -o test -framework foundation .cxx_destruct ), no vemos un selector de .cxx_destruct . Si comenta y recompila la propiedad NSObject *anobject , no verá el .cxx_destruct ya que ya no es necesario.

Usé la respuesta de esta pregunta, Listar selectores para objeto Objective-C y enumerar todos los selectores a los que responde mi objeto de clase. En una lista enorme encontré un selector llamado ".cxx_destruct" (sí, comienza con un punto), lo veo por primera vez y nunca escuché sobre eso. Busqué en Google y encontré este Objetivo C: errores ARC (problemas de lanzamiento automático) .

Tengo algunas preguntas en mi mente?

  • ¿Está relacionado con ARC?
  • Si es un selector, ¿por qué está oculto?
  • ¿Cuándo llamará? ¿Por quién, un iOS mismo?
  • ¿Por qué se llama así como .cxx_destruct? ¿Cuál es la forma completa de "cxx" ..?