2010-08-07 18 views
12

Me encontré con un problema de Objective-C que no parece tener ningún sentido para mí. Soy un programador de ObjC relativamente versado y entiendo todo el concepto de "declaración avanzada", pero este me hace rascar la cabeza. Así que aquí está el trato:"No se puede encontrar el error de declaración de interfaz ..." después de @clase

ClassA es una clase en mi proyecto Xcode que es solo de proyecto. ClassB es una subclase de ClassA que es pública y se importa en el encabezado de mi marco.

Aparece el mensaje de error "No se puede encontrar la declaración de interfaz para 'ClassA', la superclase de 'ClassB' ..." al compilar. Ya he puesto la declaración forward @class ClassA; en ClassB.h, pero eso no parece resolver el problema. Cuando cambio el @class ClassA; al #import ClassA.h, funciona bien. Sin embargo, dado que ClassA es solo de proyecto, los proyectos dependientes no pueden compilar ClassB porque no puede acceder a la fuente de ClassA.

Cualquier ayuda sería apreciada y espero que tenga sentido. ¡Gracias!

Respuesta

10

Para subclase de una clase, la declaración completa de la superclase debe estar disponible para el compilador. @class solo habilita referencias a instancias de dicha clase - permite A *foo;.

subclases requiere más metadatos (por lo menos, lo hizo bajo el tiempo de ejecución legado - Yo creo que podría ser posible para apoyar la creación de subclases sin @interface de los súper completa técnicamente posible, pero probablemente no es útil..)

+0

Hmm, pensé que como mucho. Sin embargo, eso me hace dudar qué hacer aquí. Supongo que la única ruta que me queda es hacer pública la superclase y simplemente documentar que no se recomienda el uso de la superclase. – Grimless

+1

Ah, sí. Una superclase abstracta. Sugiero que leas sobre Class Clusters porque perpetúan un patrón de diseño similar. – bbum

+0

Desafortunadamente, no creo que los grupos de clases resuelvan este problema. Los clústeres de clases ocultan subclases que proporcionan una funcionalidad específica. Estoy tratando de ocultar la * superclase * mientras sigo haciendo que las subclases estén disponibles públicamente. En cualquier caso, ¡gracias por la información! – Grimless

37

El problema es que tienes un bucle infinito en tus #importaciones. La solución: todas las importaciones entran en el archivo de implementación y todas las clases necesarias se declaran en los archivos .h.

1

Tuve un problema donde estaba usando categorías en un método de superclase y obtenía este error de herencia. Una vez que moví las categorías .h, las importaciones al archivo .m superclase empezaron a mejorar.

6

Tengo una respuesta: debe verificar su orden '#import'. Antes de usar la superclase, debe importarse y compilarse.

1

Simplemente lleve a cabo todos los posibles encabezados del archivo .h a .m de la superclase y vea cuál es la cuestión del problema. Estoy seguro de que es uno de los encabezados comunes utilizados en ambas clases.

0

Como @Igor dicho, el orden de las cosas importa:

que tenía que cambiar

#import <KeychainItemWrapper/KeychainItemWrapper.h> 
#import <Foundation/Foundation.h> 

a

#import <Foundation/Foundation.h> 
#import <KeychainItemWrapper/KeychainItemWrapper.h> 
Cuestiones relacionadas