2009-08-07 11 views
30

Ogni volta che costruisco il seguente codice, ottengo l'errore sopra.errore: lista dei programmatori di specificazione prevista prima ... nell'obiettivo 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  

Tuttavia, quando sostituisco l'istruzione import e inserisco un riferimento di classe forward, il codice viene compilato.

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

Qualcuno può spiegare?

+5

PolygonShape e PolygonView probabilmente hanno importazioni cicliche. Ecco perché esistono dichiarazioni anticipate. Usali, per favore. –

+0

PolygonShape e PolygonView non hanno importato ciclicamente, ma PolygonView e Controller lo hanno fatto. Grazie per l'aiuto! – Ridwan

+2

@ Jason: Probabilmente sarebbe una buona risposta. – Chuck

risposta

25

Sì, anche io avevo questo problema delle dipendenze cicliche in cui stavo importando entrambe le classi l'una nell'altra. Inoltre non sapevo cosa fossero le Forward Forward. Ho subito cercato su Wikipedia ma è stato descritto male. Ho trovato questo post che spiega cosa sono e in che modo si riferiscono alle importazioni cicliche. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Nota: il collegamento continua a scendere quindi ho solo PDF'd it.

3

Ciò accade perché hai dimenticato di includere uno dei file di intestazione. Avevo anche lo stesso tipo di errore, ma dopo l'inclusione corretta del file di intestazione l'errore è andato via.

8

Ho ricevuto questo errore con un semplice errore ... forse altri lo stanno facendo allo stesso modo?

corretto:

@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 

SBAGLIATO:

@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

Come sono questi due diversi? Non lo vedo –

+0

parentesi prima della proprietà vs dopo – LordFire

+0

useless..it è lo stesso per scrivere "Dovresti digitare @implementation PRIMA di @end" è evidente che devi solo inserire le variabili di classe nelle parentesi graffe – Stas

3

deve solo includere una classe che sembrava essere trascurato:

#import "NameOfClass.h" 

ed è stato risolto. Grazie.

2

È inoltre possibile verificare errori di ortografia muti. Ad esempio, ho avuto una classe denominata "MyUIViewController" ma ho scritto:

@property (nonatomic, retain) MyViewController *myViewController; 

E ha ottenuto questo errore. Dopo averlo corretto a:

@property (nonatomic, retain) MyUIViewController *myViewController; 

L'errore è stato risolto, i computer sono così letterali.

1

Ho appena avuto questo problema in un progetto Objective-C++ - in tal caso, è uno degli errori che possono sorgere se si dimentica di nominare il file di implementazione .mm anziché .m.

6

Basta seguire questa regola per evitare tali problemi:

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

Riferimento, per favore? – Madbreaks

0

Se è stato eliminato il precompilato prefisso intestazione è necessario importare manualmente i file header necessari nel file:

come

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

Mi sono imbattuto in questo errore quando cercavo di fare riferimento a un protocollo che avevo impostato io stesso.

Questo mostra il mio protocollo, il metodo sbagliato e quello che ritengo sia il metodo giusto.

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 

Solo per completezza, ecco come lo sto implementando alcuni metodi che si basano anche sul protocollo ...

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

Spero che questo aiuti qualcun altro.

Problemi correlati