Тип приемника ***, например, сообщение является форвардной декларацией

В моем приложении iOS5 у меня есть класс NSObject States и пытаюсь его инициализировать:

states = [states init];

здесь init метод в States:

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

Но есть ошибка в строке states = [states init];

Тип приемника "Штаты", например, сообщение является объявлением вперед

Что это значит? Что я делаю неправильно?

Ответ 1

Это означает, что вам нужно импортировать файл .h, содержащий декларацию состояний.

Однако в вашем коде есть много других вещей.

  • Вы не используете объект без +alloc. Это не сработает.
  • Вы объявляете объект как тип не указателя, который не будет работать
  • Вы не вызываете [super init] в -init.
  • Вы объявили класс, используя @class в заголовке, но никогда не импортировали класс.

Ответ 2

FWIW, я получил эту ошибку, когда я реализовал основные данные в существующем проекте. Оказалось, что я забыл связать CoreData.h с моим проектом. Я уже добавил инфраструктуру CoreData в свой проект, но решил проблему, связав ее с базой в моем предварительно скомпилированном заголовке, как это делают шаблоны Apple:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

Ответ 3

Я получил такое сообщение, когда у меня было два файла, которые зависели друг от друга. Трудность в том, что вы получите круговую ссылку, если вы просто попытаетесь импортировать друг друга (класс A импортирует класс B, класс B импортирует класс A) из своих файлов заголовков. Итак, что бы вы сделали, вместо этого разместите объявление вперед (@class A) в одном из заголовочных файлов классов (класса B). Однако при попытке использовать ivar класса A в реализации класса B эта ошибка возникает, просто добавив #import "A.h" в .m файл класса B, для меня проблема.

Ответ 4

Для меня я использовал @class "Myclass.h"

Когда я изменил на #import "Myclass.h"

он работал нормально.

Ответ 5

Вы используете

States states;

где, как вы должны использовать

States *states;

Ваш метод init должен выглядеть следующим образом

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

Теперь, когда вы собираетесь создать объект для класса State, вы должны сделать это следующим образом.

State *states = [[States alloc] init];

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

Ответ 6

Проверьте, были ли вы импортированы файлы заголовков классов, которые выбрасывают эту ошибку.

Ответ 7

Убедитесь, что прототип вашего метода unit находится в файле .h.

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

Ответ 8

Есть два связанных сообщения об ошибках, которые могут сказать вам, что что-то не так с декларациями и/или импортом.

Первым из них является тот, к которому вы обращаетесь, который может быть сгенерирован, не помещая #import в ваш .m(или .pch файл), объявляя @class в вашем .h.

Второе, что вы могли бы увидеть, если бы у вас был метод в вашем классе States, например:

- (void)logout:(NSTimer *)timer

после добавления #import это:

Нет видимого @interface для "States" объявляет "выход из системы":

Если вы видите это, вам нужно проверить и посмотреть, был ли вы объявлен ваш метод "logout" (в этом случае) в файле .h класса, который вы импортируете или пересылаете.

Итак, в вашем случае вам понадобится:

- (void)logout:(NSTimer *)timer;

в вашем классе состояний .h, чтобы одна или обе эти связанные ошибки исчезли.