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

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

states = [states init];

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

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

    return self;
}

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

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

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


person SentineL    schedule 11.01.2012    source источник
comment
Я пытался ответить на один и тот же вопрос, но в каждом из них есть разные решения. Я немного запутался   -  person SentineL    schedule 11.01.2012
comment
Очень короткий ответ: либо вам не хватает #import (возможно, в вашем файле префикса), либо вам не хватает @class Abc; строка (т.е. в файле .h чуть выше строки @interface)   -  person Fattie    schedule 02.03.2014
comment
Также убедитесь, что это быстрый класс и вы используете @objc (ClassName), что это имя соответствует определению имени вашего класса. Дело имеет значение.   -  person danroose    schedule 14.10.2020


Ответы (9)


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

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

  • Вы создаете объект, но не +alloc. Это не сработает
  • Вы объявляете объект как тип без указателя, который тоже не будет работать
  • Вы не звоните [super init] в -init.
  • Вы объявили класс, используя @class в заголовке, но никогда не импортировали класс.
person Catfish_Man    schedule 11.01.2012
comment
Это немного странно, поскольку в моем случае я просто удалил файл .h из-за проблемы с циклической ссылкой. - person Alper; 16.11.2017
comment
Что за нелепая формулировка. Но да, это исправило. - person TimJowers2; 21.08.2018
comment
Если вы пытаетесь использовать объекты Swift в Objective-C, не забывайте, что они должны наследовать от NSObject. - person Michal Šrůtek; 20.02.2020
comment
Вы также можете получить эту ошибку при размещении MyProject-Swift.h в #ifdef FB_SONARKIT_ENABLED или #if DEBUG - тогда он работает в симуляторе, но не при сборке выпуска. - person scbojer; 04.03.2021

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
person capikaw    schedule 07.02.2013
comment
Какая жалость, что почти все учебники CoreData начинаются с использования шаблона, а не с существующего проекта. Здесь довольно легко ошибиться. - person Yeung; 15.10.2013

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

person Stunner    schedule 06.06.2012

Я пытался использовать @class "Myclass.h".

Когда я изменил его на #import "Myclass.h", он работал нормально.

person Suraj K Thomas    schedule 11.02.2015
comment
Замечание: @class "Myclass.h" совершенно неверно. @class Myclass следует использовать в файле заголовка, где класс не может быть импортирован (из-за циклических ссылок, например, как это происходит с классом, определенным Swift в Objective-C), но #import "Myclass.h" следует использовать, если его можно импортировать. - person ReinstateMonica3167040; 19.06.2020

Если вы получаете эту ошибку при попытке использовать класс или метод Swift в цели C: вы забыли один из двух шагов, определенных Apple на этой диаграмме:

введите описание изображения здесь

Пример:

Ошибка обнаруживается в вашем Test.m файле:

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

Шаг 1. Убедитесь, что Test.h

@class MyClass;

Шаг 2: найдите *-Swift.h имя файла в Настройках сборки (найдите Имя заголовка интерфейса, сгенерированного Objective-C). Имя будет примерно таким: MyModule-Swift.h

Шаг 3. Убедитесь, что Test.m импортирует указанный выше заголовок

#import "MyModule-Swift.h"
person Kiril S.    schedule 10.01.2020

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

States states;

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

States *states;

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

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

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

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

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

person Arslan    schedule 11.01.2012

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

person nemesis    schedule 27.01.2014

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

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

person Fletch    schedule 11.01.2012

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

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

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

- (void)logout:(NSTimer *)timer

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

Отсутствие видимого @interface для "Состояния" объявляет селектор "выход из системы:"

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

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

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

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

person whyoz    schedule 28.01.2013