2013-05-08 3 views
4

Довольно простой материал, но я не могу устранить проблему, где проблема. В моем проекте, у меня есть класс с именем «TheFeedStore» со следующими двумя способами:ARC Semantic Issue: No visible @interface для класса объявляет селектор

- (BOOL)hasItemBeenRead:(RSSItem *)item 
{ 
    ............ 
} 

- (void)markItemAsRead:(RSSItem *)item 
{ 
    ......... 
} 

Я использую следующий метод класса, так что другие классы могут получить доступ к этим методам его использования:

+ (TheFeedStore *) sharedStore 
{ 
    static TheFeedStore *feedStore = nil; 

    if (!feedStore) { 
     feedStore = [[TheFeedStore alloc] init]; 
    } 
    return feedStore; 
} 

В одном мой другой класс, я могу легко получить доступ к вышеуказанным методам, написав

if ([[TheFeedStore sharedStore] hasItemBeenRead:item]) 

или

[[TheFeedStore sharedStore] markItemAsRead:entry]; 

Но в другом классе, если я пытаюсь получить доступ к этим методам аналогичным образом, я получаю сообщение об ошибке «Нет видимых @interface для„TheFeedStore“заявляет селектор«hasItemBeenRead:»

1) I have imported TheFeedStore.h file in the classes from i am accessing these methods of TheFeedStore class.

2) I have checked like 10 times and there is no typo.

3) The methods i am accessing are also declared in the header file of TheFeedStore.h

UPDATE: Просто, чтобы проверить, я объявил еще один метод тестирования в TheFeedStore.h, тот же результат, один класс может получить доступ к вновь созданному методу, пока остальные три класса не могут.

UPDATE: Я попытался создать больше методов в TheFeedStore.h только для устранения этой проблемы. Новые методы также недоступны из других классов. Но если тип возврата этих новых методов (RSSChannel *), который является другим модельным классом в моем проекте, становится доступным. Если их тип возврата отличается от некоторого класса (void) и (BOOL), то они недоступны. Вот мой TheFeedStore.h https://gist.github.com/jessicamoore112/5558473

+1

Вы '# импортировали 'класс в класс, где вы получаете эту ошибку? –

+0

, конечно, я импортировал класс. Он не распознает методы, даже метод класса «sharedStore» входит в список автозаполнения, когда я набираю [[TheFeedStore sharedStore] – AJ112

+0

, что у вас есть в файле TheFeedStore.h? Вы объявили эти методы экземпляра в .h? –

ответ

5

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

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

Когда вы это делаете, иногда Xcode по-прежнему использует старые копии нескольких файлов. Это означает, что он все еще использует старую копию TheFeedStore.h, когда методы, которые вы пытаетесь получить, не были объявлены вами.

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

В разделе «Утилиты» с правой стороны проверьте местоположение и полный путь в области «Идентификация и тип».

Сначала проверьте имена проекта, если он отличается от имени проекта, над которым вы работаете, что означает, что Xcode по-прежнему вытаскивает старые копии файлов из предыдущей версии вашего проекта. См. Синие стрелки, где имя проекта 13SampleMoreRequests в моем случае.

utilities

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

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

Надеюсь, это поможет!

+0

Это очень хорошее предложение :) он не разрешает мою проблему, хотя :), но, по крайней мере, указывает на то, что эта ошибка может быть приведена (здесь приведено надлежащее описание) XCode. В дереве проектов у меня есть класс с современными методами, но когда я перехожу от оператора import в классе, где произошла ошибка, он переносит меня в старую версию класса - и «Не применимо», отображаемую на панели «Утилиты» , –

1

Это может показаться глупым, но время от времени у меня есть подобные случаи, а иногда просто простое отключение и запуск xcode помогает, он иногда застревает. Также иногда помогает очистка проекта. Потому что я очень похож на ваш сингл-код, и он отлично работает.

+0

Я очистил, перезапустил xcode, сбросил симулятор, это не сработало. Как вы сказали, «это может показаться глупым»: D – AJ112

+0

Возможно, вы можете где-нибудь загрузить часть своего проекта, чтобы я мог взглянуть на нее? – titicaca

+0

Я добавил код singleton class здесь https://gist.github.com/jessicamoore112/5558473 – AJ112

2

Циклический импорт, например. A.h импорт B.h, а также B.h импорт A.h является наиболее распространенной проблемой.

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

Проблемы с импортом можно также легко проверить, если вы сгенерируете предварительно обработанный выход (вы можете найти его в одном из меню Xcode).

+0

1) Я использую форвардную декларацию вместо операторов импорта. 2) В Product> Generate Output есть этот параметр для файла предварительной версии, но он создал чрезвычайно длинный файл, и я не знаю, как его проверить для своей проблемы. – AJ112

+0

Когда я использую параметр Preprocess file, ошибка исчезает и он представляет мне длинный файл.Запуск программы снова приводит к ошибке – AJ112

+0

@ AJ112 Возможно, вам следует сначала узнать, как препроцессор, особенно импорт и включает в себя работу. – Sulthan

1

Ребята, я столкнулся с теми же проблемами. После некоторого поиска в SO и поисковой системе я смог ее решить.

В моем случае у меня есть четыре файла:

  • RadioStation.h
  • RadioStation.m
  • ViewController.h
  • ViewController.m

Моя ошибка была поставить все мои методы в RadioStation.m и только поместить мои переменные на radioStation.h Итак, когда я импортирую radioSation.h на свой V iewController.m и попытайтесь определить методы для нажатия кнопки на моем приложении, где возникли проблемы. Я получил ошибку/предупреждения «ARC Semantic Issue: No visible @interface для класса объявляет селектор» каждый раз, когда я создавал или запускал симулятор приложения.

Мое решение должно быть возвращено к файлу RadioStation.h и просто объявить все мои методы там. Поскольку они уже были определены на RadioStation.m Мне было хорошо.

Так что убедитесь, что вы правильно объявили свои методы в файле, который будет импортирован на ваш viewControllers. Надеюсь, что помогает.

0

В моем случае у меня были некоторые очень странные записи пути в

  • Framework Пути поиска
  • Библиотека Путь поиска

(Targets -> YOUR_APP_NAME -> Build Settings в "Пути поиска" раздел)

Я удалил их, и сообщения об ошибках исчезли.

Смежные вопросы