Objective-C #import loop

Tengo el siguiente código:

#import  #import "ServerRequest.h" // works even though this line is included #import "ServerResponseRecord.h" @protocol ServerRequestDelegate -(void)request:(id)request gotResponseRecord:(ServerResponseRecord*)response; -(void)request:(id)request gotError:(NSError*)error; @end 

Se comstack y funciona bien. Sin embargo, si reemplazo las declaraciones de método con:

 -(void)request:(ServerRequest*)request gotResponseRecord:(ServerResponseRecord*)response; -(void)request:(ServerRequest*)request gotError:(NSError*)error; 

Obtengo el error de syntax inesperado “error: esperado”) “antes de ‘ServerRequest'”. La única razón por la que puedo pensar que esto podría ser un problema es que ServerRequestDelegate.h y ServerRequest.h # importan entre sí. Sin embargo, no entiendo por qué el código funciona con la solicitud #import line with (id). Tampoco entiendo por qué es un error de syntax.

¿Alguien puede dar una buena explicación?

Ya has insinuado la explicación: un ciclo de importación.

Lo primero que haría sería eliminar el #include y agregar la siguiente línea sobre la definición de @protocol :

 @class ServerRequest; 

Esta es una statement de clase forward y puede ayudar a romper el ciclo de importación. Mira esta pregunta SO para más detalles. Apple también tiene una breve explicación en esta guía .

Básicamente, #import un archivo hace que el comstackdor traiga el texto completo de ese archivo al archivo en cuestión, y aunque #include #import es “más inteligente” que #include , no significa que sea inmune a los errores de importación. La statement @class es una forma de decirle al comstackdor que existe una clase sin importar el encabezado. Es apropiado usarlo cuando solo se necesita saber sobre el nombre de la clase, pero no se preocupan por los métodos que proporciona. En general, quiere usar @class en el archivo .h y #import en el archivo .m, donde en realidad está interactuando con la clase.

Los “bucles” de importación no son un problema. #import es lo mismo que #include, excepto que rastrea los archivos y se asegura de que el preprocesador los lea solo la primera vez.

Por lo general, cuando recibe un error como ese, se debe a un problema en el archivo incluido. Entonces, el error probablemente esté en ServerResponseRecord.h, pensó que probablemente se disparó al usar realmente el objeto declarado por él. Sin ver los encabezados completos, no es posible decir exactamente lo que está sucediendo.