2009-08-07 8 views
30

Cada vez que construyo el siguiente código, aparece el error anterior.error: especificador-calificador-lista esperado antes de ... en el objetivo C?

//Controller.h 
#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import "PolygonShape.h" 
#import "PolygonView.h"; 

@interface Controller : NSObject 
{ 
    IBOutlet UIButton *decreaseButton; 
    IBOutlet UIButton *increaseButton; 
    IBOutlet UILabel *numberOfSidesLabel; 
    IBOutlet PolygonShape *shape; 
    IBOutlet PolygonView *shapeView; 
} 
- (IBAction)decrease; 
- (IBAction)increase; 
- (void)awakeFromNib; 
@end 


//Controller.m 
#import "Controller.h" 


@implementation Controller 
@end  

Sin embargo, cuando reemplazo la instrucción de importación y pongo una referencia de referencia de clase en su lugar, el código se compila.

//Controller.h 

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import "PolygonShape.h" 
@class PolygonView; 

@interface Controller : NSObject 
{ 
    IBOutlet UIButton *decreaseButton; 
    IBOutlet UIButton *increaseButton; 
    IBOutlet UILabel *numberOfSidesLabel; 
    IBOutlet PolygonShape *shape; 
    IBOutlet PolygonView *shapeView; 
} 
- (IBAction)decrease; 
- (IBAction)increase; 
- (void)awakeFromNib; 
@end 

//Controller.m 
#import "Controller.h" 
#import "PolygonView.h" 

@implementation Controller 
@end 

¿Alguien puede explicarlo?

+5

PolygonShape y PolygonView probablemente tengan importaciones cíclicas. Es por eso que existen declaraciones avanzadas. Úselos, por favor. –

+0

PolygonShape y PolygonView no tenían importaciones cíclicas, pero PolygonView y Controller sí. ¡Gracias por la ayuda! – Ridwan

+2

@Jason: Eso probablemente sería una buena respuesta. – Chuck

Respuesta

25

Sí, yo también tenía este problema de Dependencias cíclicas donde importaba ambas clases el uno al otro. Tampoco sabía qué eran las Declaraciones a futuro. Inmediatamente lo busqué en Wikipedia pero estaba mal descrito. Encontré esta publicación que explica qué son y cómo se relacionan con las importaciones cíclicas. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Nota: El enlace sigue bajando, así que simplemente PDF'd it.

3

Esto sucede porque olvidó incluir uno de los archivos de encabezado. También recibía el mismo tipo de error, pero después de la inclusión correcta del archivo de encabezado, el error desapareció.

8

Recibí este error con un simple error ... ¿quizás otros están haciendo lo mismo?

correcta:

@interface ButtonDevice : NSObject 

{ 

    NSString *name; 
    NSString *uri; 
    NSString *icon; 
} 

    @property (nonatomic, retain) IBOutlet NSString *name; 
    @property (nonatomic, retain) IBOutlet NSString *uri; 
    @property (nonatomic, retain) IBOutlet NSString *icon; 
@end 

MAL:

@interface ButtonDevice : NSObject 
{ 

    NSString *name; 
    NSString *uri; 
    NSString *icon; 

    @property (nonatomic, retain) IBOutlet NSString *name; 
    @property (nonatomic, retain) IBOutlet NSString *uri; 
    @property (nonatomic, retain) IBOutlet NSString *icon; 
} 
@end 
+0

¿Cómo son estos dos diferentes? Yo no lo veo –

+0

paréntesis antes de la propiedad vs después de – LordFire

+0

inútil ... es lo mismo que escribir "Deberías escribir @implementation ANTES del @end", es evidente que solo debes poner las variables de clase entre llaves – Stas

3

acaba de incluir una clase que parecía ser pasado por alto:

#import "NameOfClass.h" 

, pero lo solucionaron. Gracias.

2

También puede verificar errores de ortografía tontos. Por ejemplo, tenía una clase llamada 'MyUIViewController' pero escribí:

@property (nonatomic, retain) MyViewController *myViewController; 

Y tengo este error. Después de que lo corrigí a:

@property (nonatomic, retain) MyUIViewController *myViewController; 

Se corrigió el error, las computadoras son tan literales.

1

Acabo de tener este problema en un proyecto Objective-C++; en ese caso, es uno de los errores que pueden surgir si olvida nombrar su archivo de implementación .mm en lugar de .m.

6

Sólo tiene que seguir esta regla para evitar este tipo de problemas:

If an object is only used internally by class's implementation file, use forward declaration in the header file and import/include in the implementation file. Otherwise use import in the header.

+0

¿Referencia, por favor? – Madbreaks

0

Si ha eliminado el Prefijo encabezado precompilado debe importar manualmente la cabecera de los archivos necesarios en el fichero:

como

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
1

Me encontré con este error al tratar de hacer referencia a un protocolo que había configurado yo mismo.

Esto muestra mi protocolo, el método incorrecto y lo que creo que es el método correcto.

in .h 
// ------------------------------------ EtEmailDelegate Protocol -BEGIN- -------------------------------------- 
@protocol EtEmailDelegate 
    - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error; //<-- This is really just one chunk from the MFMailComposeViewControllerDelegate 
@end 
// ------------------------------------ EtEmailDelegate Protocol -END- -------------------------------------- 


@interface ClsEtEmail : NSObject < MFMailComposeViewControllerDelegate> { 
    // owner 
    UIViewController *myUivc; 
    //EtEmailDelegate *myDelegate; // <--- the wrong way, throw error 
    id<EtEmailDelegate> *myDelegate; // <-- the right way (i think) 
    ... 
    } 
    @property (nonatomic, readwrite, assign) id<EtEmailDelegate> delegate; 
@end 

simplemente para la corrección, así es como estoy poniendo en práctica algunos métodos que también se basan en el protocolo ...

in .m 
@synthesize delegate = myDelegate; 

// my static initializer 
+(id) objEtEmailWithUivc: (UIViewController*) theUivc delegate: (id <EtEmailDelegate>) theDelegate { 
    ClsEtEmail * obj = [[[ClsEtEmail alloc] initWithlUivc: theUivc delegate:theDelegate] autorelease];  
    return obj; 
} 


// my normal init 
- (id)initWithlUivc: (UIViewController*) theUivc delegate: (id <EtEmailDelegate>) theDelegate { 
    self = [super init]; 
    if (self) { 
    [self init_]; // my private init (not seen) 
    self.uivc = theUivc; 
    NSAssert([theDelegate conformsToProtocol:@protocol(EtEmailDelegate)],@"whoh - this can't is notE tEmailDelegate"); 
    self.delegate = theDelegate; 
    } 
    return self; 
} 

Espero que esto ayude a alguien más.

Cuestiones relacionadas