Objetivo-C: Declaración de clase adelante

Estoy escribiendo una aplicación de vistas múltiples que utiliza una clase llamada RootViewController para cambiar de vista.

En mi encabezado MyAppDelegate , creo una instancia de RootViewController llamada rootViewController . He visto ejemplos de tales casos en los que la directiva @class se usa como una “statement de clase avanzada”, pero no estoy muy seguro de lo que esto significa o lo que logra.

 #import  @class RootViewController; @interface MyAppDelegate . . . 

Básicamente le dice al comstackdor que existe la clase RootViewController , sin especificar exactamente cómo se ve (es decir: sus métodos, propiedades, etc.). Puede usar esto para escribir código que incluya variables miembro RootViewController sin tener que incluir la statement de clase completa.

Esto es particularmente útil para resolver dependencias circulares; por ejemplo, cuando ClassA tiene un miembro de tipo ClassB* y ClassB tiene un miembro de tipo ClassA* . ClassB declarar ClassB antes de poder usarlo en ClassA , pero también necesita declarar ClassA antes de poder usarlo en ClassB . Las declaraciones ClassA le permiten superar esto diciendo a ClassA que existe ClassB , sin tener que especificar realmente la especificación completa ClassB's .

Otra razón por la que tiende a encontrar muchas declaraciones avanzadas es que algunas personas adoptan una convención de clases que declaran hacia adelante a menos que deban incluir obligatoriamente la statement completa. No lo recuerdo del todo, pero posiblemente eso es algo que Apple recomienda en su guía de estilo de guía de Objective-C.

Siguiendo con mi ejemplo anterior, si sus declaraciones de ClassA y ClassB están en los archivos ClassA.h y ClassB.h , respectivamente, tendrá que #import cualquiera que use su statement en la otra clase. El uso de la statement directa significa que no necesita el #import , lo que hace que el código sea más bonito (especialmente una vez que comience a recostackr bastantes clases, cada una de las cuales necesitaría un `#import donde se usa), y aumenta el rendimiento de comstackción al minimizar el cantidad de código que el comstackdor necesita considerar al comstackr cualquier archivo dado.

Como comentario aparte, aunque la pregunta se refiere únicamente a las declaraciones avanzadas en el Objetivo-C, todos los comentarios anteriores también se aplican a la encoding en C y C ++ (y probablemente en muchos otros idiomas), que también respaldan la statement directa y la utilizan típicamente para el mismos fines.

Las declaraciones directas son principalmente para evitar importaciones circulares, donde un archivo importa otro archivo que importa el primer archivo, etc. Básicamente cuando se importa un archivo, el contenido del archivo se sustituye en el punto de importación cuando se construye el proyecto, que luego se alimenta al comstackdor Si tiene importaciones circulares, tendría un bucle infinito que nunca se comstackría. Afortunadamente, xcode le informará sobre esto antes de intentarlo. La statement de reenvío dice “No importe esta clase, solo tenga en cuenta que existe”. Sin una statement de importación o de reenvío, aparece el error de que no existe dicha clase.