ошибка: ожидаемый список спецификаторов-определителей до ... в Цели C? - PullRequest
30 голосов
/ 07 августа 2009

Всякий раз, когда я строю следующий код, я получаю ошибку выше.

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

Однако, когда я заменяю оператор импорта и вместо него помещаю прямую ссылку на класс, код компилируется.

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

Может кто-нибудь объяснить?

Ответы [ 9 ]

25 голосов
/ 19 октября 2009

Да, у меня тоже была проблема циклических зависимостей, когда я импортировал оба класса друг в друга. Я также не знал, что такое предварительные декларации. Я быстро искал это в Википедии, но это было плохо описано. Я нашел этот пост, который объясняет, что они из себя представляют и как они связаны с циклическим импортом. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Примечание. Ссылка не работает, поэтому я просто отправил PDF .

8 голосов
/ 24 марта 2010

Я получил эту ошибку с простой ошибкой ... возможно, другие делают то же самое?

ПРАВИЛЬНО:

@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

НЕПРАВИЛЬНО:

@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
6 голосов
/ 04 июня 2011

Просто следуйте этому правилу, чтобы избежать таких проблем:

Если объект используется только внутри файл реализации класса, используйте предварительное объявление в заголовочном файле и импорт / включение в файл реализации. В противном случае используйте import в шапке.

3 голосов
/ 23 октября 2010

Просто нужно включить класс, который, казалось, упустили из виду:

#import "NameOfClass.h"

и это было отсортировано. Спасибо.

3 голосов
/ 05 февраля 2010

Это происходит потому, что вы забыли включить один из заголовочных файлов. Я также получал такую ​​же ошибку, но после правильного включения заголовочного файла ошибка исчезла.

2 голосов
/ 01 мая 2011

Вы также можете проверить на наличие глупых орфографических ошибок. Например, у меня был класс MyUIViewController, но я написал:

@property (nonatomic, retain) MyViewController *myViewController; 

И получил эту ошибку. После того, как я исправил это до:

@property (nonatomic, retain) MyUIViewController *myViewController; 

Ошибка была исправлена, компьютеры настолько буквальны.

1 голос
/ 07 октября 2011

Я столкнулся с этой ошибкой, пытаясь сослаться на протокол, который я сам установил.

Это показывает мой протокол, неправильный метод и то, что я считаю правильным методом.

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

Просто для полноты, вот как я реализую некоторые методы, которые также опираются на протокол ...

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

Надеюсь, это поможет кому-то еще.

1 голос
/ 04 июня 2011

Я только что столкнулся с этой проблемой в проекте Objective-C ++ - в этом случае это одна из ошибок, которая может возникнуть, если вы забудете назвать файл реализации .mm вместо .m.

0 голосов
/ 03 августа 2011

Если вы удалили заголовок прекомпилированного префикса, вы должны вручную импортировать необходимые файлы заголовков в файл:

как

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...