Pregunta

Estoy creando una aplicación Cocoa y usando Xcode para generar varios códigos.Funciona bien para generar archivos .h y .m para subclasificar UIView, pero cuando subclasifica UIViewController obtengo un @interface declaración idéntica en ambos archivos, excepto que en el archivo .m tiene ( ) al final:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

pero también

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

Sin embargo, se compila bien.Entonces, suponiendo que este sea un comportamiento normal, las dos partes de la pregunta son:(A) ¿Por qué sucede esto y (b) cuáles son los resultados, especialmente en términos de orden de compilación?

¡Gracias!

¿Fue útil?

Solución

cuando subclase UIViewController obtengo una declaración @interface idéntica en ambos archivos, excepto que en el archivo .m tiene ()

Como habrás notado, los dos bloques de interfaz son no idéntico - el () es importante.El que tiene el () es un extensión de clase, que es similar a una categoría sin nombre.Las dos diferencias importantes entre una categoría y una extensión de clase son:

  1. Puede declarar variables de instancia en una extensión de clase, pero no en una categoría.

  2. Una extensión de clase debe aparecer en el mismo archivo que el bloque de implementación.

Las extensiones de clase son útiles para declarar variables de instancia y métodos que no desea exponer en el archivo de encabezado, como métodos o variables que son específicos de la implementación y en los que los usuarios de la clase no deben confiar.

Otros consejos

¿Está familiarizado con las categorías?Lo que estás observando es similar, pero tiene diferencias importantes con respecto a las Categorías.La distinción aquí es que es anónimo (de ahí los pares vacíos) y se compila al mismo tiempo que se compila la clase original.Esa última parte es una parte importante:significa que puede agregar propiedades de instancia (almacenamiento).Esto se usa más comúnmente para declarar métodos y propiedades "solo internos" o "privados".Pero tenga en cuenta que en tiempo de ejecución no existe la noción de aplicación "privada", todo se trata de qué interfaz ha publicado o qué interfaz ha publicado.no publicado.Esta es sólo una forma de tener una interfaz muy claramente definida que sólo se "publica" para las personas que crean el archivo de implementación de la clase principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top