Тип приемника ***, например, сообщение является форвардной декларацией
В моем приложении 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, чтобы одна или обе эти связанные ошибки исчезли.