2009-08-07 8 views
30

Ilekroć buduję poniższy kod, otrzymuję błąd powyżej.błąd: oczekiwana lista-kwalifikatora przed ... w C celu?

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

Jednak, gdy zamieniam instrukcję importu i wstawię odwołanie do klasy forward, kod kompiluje się.

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

Czy ktoś może wyjaśnić?

+5

PolygonShape i PolygonView prawdopodobnie mają import cykliczny. Dlatego istnieją deklaracje terminowe. Użyj ich, proszę. –

+0

PolygonShape i PolygonView nie miały cyklicznych importów, ale PolygonView i Controller to zrobiły. Dzięki za pomoc! – Ridwan

+2

@Jason: To prawdopodobnie by dobra odpowiedź. – Chuck

Odpowiedz

25

Tak, ja też miałem ten problem uzależnień cyklicznych, w których importowałem obie klasy do siebie nawzajem. Nie wiedziałem także, jakie były deklaracje Forward. Natychmiast przeszukałem go na Wikipedii, ale został źle opisany. Znalazłem ten post, który wyjaśnia, czym one są i jak odnoszą się do cyklicznego importu. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Uwaga: Link dalej schodzi, więc po prostu PDF'd it.

3

Dzieje się tak, ponieważ zapomniałeś dołączyć jeden z plików nagłówkowych. Otrzymałem również ten sam błąd, ale po poprawnym dołączeniu pliku nagłówkowego błąd zniknął.

8

Mam ten błąd z prostym błędem ... może inni robią podobnie?

popraw:

@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 

źle:

@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

Jak są te dwa różne? Nie widzę tego. –

+0

wspornik przed właściwością vs po – LordFire

+0

bezużyteczny ... tak samo jest z napisem "Powinieneś wpisać @implementation PRZED @endu" jest oczywiste, że powinieneś wstawiać tylko zmienne klasy w nawiasach klamrowych – Stas

3

prostu musi zawierać klasę, która wydawała się być pomijane:

#import "NameOfClass.h" 

i było to załatwiane. Dzięki.

2

Możesz również sprawdzić błędy pisowni. Na przykład, miałem klasę o nazwie "MyUIViewController", ale napisałem:

@property (nonatomic, retain) MyViewController *myViewController; 

Mam ten błąd. Po poprawieniu go do:

@property (nonatomic, retain) MyUIViewController *myViewController; 

Błąd został naprawiony, komputery są tak dosłowne.

1

Po prostu miałem ten problem w projekcie Objective-C++ - w takim przypadku jest to jeden z błędów, które mogą pojawić się, jeśli zapomnisz nazwać swój plik implementacji .mm zamiast .m.

6

Wystarczy przestrzegać tej reguły, aby uniknąć takich problemów:

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

Odniesienia, proszę? – Madbreaks

0

Jeśli usunięto prekompilowany prefiks żniwna należy ręcznie zaimportować nagłówka pliki potrzebne do pliku:

jak

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

Wystąpił ten błąd, próbując odwołać się do protokołu, który sam utworzyłem.

To pokazuje mój protokół, niewłaściwą metodę i to, co uważam za właściwą metodę.

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 

Tylko dla kompletności, tutaj jest jak jestem wykonawczych kilka metod, które również bazują na protokole ...

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

nadzieję, że pomoże ktoś inny.

Powiązane problemy