тип получателя ***, например, сообщение является предварительным объявлением - PullRequest
193 голосов
/ 11 января 2012

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

states = [states init];

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

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

    return self;
}

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

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

Что это значит? Что я делаю не так?

Ответы [ 8 ]

428 голосов
/ 11 января 2012

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

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

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

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
23 голосов
/ 06 июня 2012

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

15 голосов
/ 11 февраля 2015

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

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

все работало нормально.

6 голосов
/ 11 января 2012

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

States states;

где как следует использовать

States *states;

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

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

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

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

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

3 голосов
/ 27 января 2014

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

1 голос
/ 11 января 2012

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

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

0 голосов
/ 29 января 2013

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

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

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

- (void)logout:(NSTimer *)timer

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...