it-swarm.com.ru

тип получателя ***, например, сообщение является предварительным объявлением

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

states = [states init];

вот метод init в States:

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

    return self;
}

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

приемник типа "Состояния", например, сообщение является предварительной декларацией

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

192
SentineL

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

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

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

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
27
capikaw

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

23
Stunner

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

Когда я перешел на #import "Myclass.h"

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

15
Suraj K Thomas

Ты используешь

States states;

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

States *states;

Ваш метод инициализации должен быть таким

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

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

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

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

6
Arslan

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

3
nemesis

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

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

1
Fletch

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

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

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

- (void)logout:(NSTimer *)timer

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

Нет видимого @interface для "States" объявляет селектор 'logout:'

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

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

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

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

0
whyoz