2009-08-07 3 views
30

Chaque fois que je compile le code suivant, j'obtiens l'erreur ci-dessus. Toutefois, lorsque je remplace l'instruction import et que je place une référence de classe forward à la place, le code est compilé.erreur: spécificateur-qualifier-liste attendue avant ... en Objective C?

//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 

Quelqu'un peut-il expliquer?

+5

PolygonShape et PolygonView ont probablement des importations cycliques. C'est pourquoi les déclarations anticipées existent. Utilisez-les, s'il vous plaît. –

+0

PolygonShape et PolygonView n'ont pas eu d'importations cycliques, mais PolygonView et Controller l'ont fait. Merci pour l'aide! – Ridwan

+2

@Jason: Cela ferait probablement une bonne réponse. – Chuck

Répondre

25

Oui, j'avais aussi ce problème de dépendances cycliques où j'importais les deux classes les unes dans les autres. Je ne savais pas non plus ce que les Déclarations à l'Avant étaient. J'ai rapidement cherché sur Wikipédia, mais il était mal décrit. J'ai trouvé ce post qui explique ce qu'ils sont et comment ils se rapportent aux importations cycliques. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Note: Le lien ne cesse de descendre alors je viens de PDF'd it.

3

Cela se produit parce que vous avez oublié d'inclure l'un des fichiers d'en-tête. Je recevais également le même type d'erreur, mais après l'inclusion correcte du fichier d'en-tête, l'erreur s'est dissipée.

8

J'ai eu cette erreur avec une simple erreur ... peut-être que d'autres font de même?

CORRIGER:

@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

Comment sont ces deux différents? Je ne le vois pas. –

+0

support avant la propriété vs après – LordFire

+0

inutile .. c'est la même chose à écrire "Vous devez taper @implementation AVANT le @end" il est juste évident que vous ne devriez mettre que des variables de classe dans les accolades – Stas

3

Tout doit inclure une classe qui semblait être négligé:

#import "NameOfClass.h" 

et a été réglé. Merci.

2

Vous pouvez également vérifier les fautes d'orthographe. Par exemple, j'avais une classe appelée « MyUIViewController », mais je l'ai écrit:

@property (nonatomic, retain) MyViewController *myViewController; 

et a obtenu cette erreur. Après avoir corrigé à:

@property (nonatomic, retain) MyUIViewController *myViewController; 

L'erreur a été résolue, les ordinateurs sont si littérale.

1

Je viens d'avoir ce problème dans un projet Objective-C++ - dans ce cas, c'est l'une des erreurs qui peuvent apparaître si vous oubliez de nommer votre fichier d'implémentation .mm au lieu de .m.

6

Il suffit de suivre cette règle pour éviter de tels problèmes:

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

Référence, s'il vous plaît? – Madbreaks

0

Si vous avez supprimé l'en-tête de préfixe précompilés vous devez importer manuellement l'en-tête des fichiers nécessaires dans le fichier:

comme

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

J'ai rencontré cette erreur en essayant de référencer un protocole que j'avais moi-même mis en place.

Ceci montre mon protocole, la mauvaise méthode et ce que je pense être la bonne méthode.

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 

Juste pour être complet, voici comment je mettre en œuvre des méthodes qui reposent également sur le protocole ...

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; 
} 

Hope this helps quelqu'un d'autre.

Questions connexes