ARC语义问题:类没有可见的@interface声明选择器

时间:2013-05-08 02:51:25

标签: iphone ios objective-c xcode class-method

非常基本的东西,但我无法解决问题所在。在我的项目中,我有一个名为“TheFeedStore”的类,有以下两种方法:

- (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];

但是在另一个类中,如果我尝试以类似的方式访问这些方法,我得到错误“NoFeedStore'没有可见@interface'声明选择器'hasItemBeenRead:”

  

1)我已经在我的类中导入了TheFeedStore.h文件   访问TheFeedStore类的这些方法。

     

2)我已经检查了10次并且没有拼写错误。

     

3)我正在访问的方法也在头文件中声明   TheFeedStore.h

UPDATE:为了检查,我已经在TheFeedStore.h中声明了另一个测试方法,同样的结果,一个类可以访问新创建的方法,而其余三个类则不能。

更新:我已尝试在TheFeedStore.h中创建更多方法,仅用于解决此问题。其他类也无法访问新方法。但是如果这些新方法的返回类型是(RSSChannel *),它是我项目中的另一个模型类,那么它们就变得可访问了。如果它们的返回类型不是某些类,如(void)和(BOOL)那么它们是不可访问的。这是我的TheFeedStore.h https://gist.github.com/jessicamoore112/5558473

5 个答案:

答案 0 :(得分:6)

您已经说过在头文件中使用@class而不是#import,您尝试访问的方法在头文件中声明,并且没有任何类型的拼写错误。

在这种情况下,通常没有人指出这个问题,但无论如何我都会这样做,因为我多次遇到过这样的问题。您可能已经创建了许多项目副本,以处理每个功能并保持工作项目。

执行此操作时,有时Xcode仍在使用少量文件的旧版本。这意味着当你没有声明你试图访问的方法时,它仍在使用TheFeedStore.h的旧版本。

如何解决这个问题非常简单。转到您尝试访问方法的文件以及声明这些方法的文件。

在右侧的“公用事业”部分中,检查“身份和类型”区域下的位置和完整路径。

首先检查项目的名称,如果它与您正在处理的项目名称不同,这意味着Xcode仍在从项目的上一版本中提取文件的旧副本。在我的案例中,请参阅项目名称为13SampleMoreRequests的蓝色箭头。

utilities

如果此名称与您的项目名称相同,那么我的答案无法解决您的问题。如果不同,则应使用红色箭头指示的符号浏览新位置,以使用该文件的新副本。

一旦浏览并使用新文件,您的问题就会得到解决,您将能够访问这些方法。如果你仍然不能,复制这些文件,从项目中删除,然后再次添加它们,你将不会遇到这个问题。

希望这有帮助!

答案 1 :(得分:2)

周期性进口,例如A.h导入B.hB.h导入A.h是最常见的问题。

在C语言中,循环导入不起作用,其中一个导入将被默默忽略。确保您没有周期性导入。如果你这样做,解决它(例如使用前向声明)。

如果生成预处理输出(也可以在其中一个Xcode菜单中找到),也可以轻松检查导入问题。

答案 2 :(得分:1)

这可能听起来很傻,但我偶尔会遇到类似的情况,有时只是简单的退出并开始xcode有帮助,它有时会卡住。 此外,有时清理项目有帮助。 因为我和你的单身代码非常相似,而且效果很好。

答案 3 :(得分:1)

伙计我遇到过同样的问题。在搜索了SO和搜索引擎后,我能够解决它。

在我的案例中,我有四个文件:

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

我的错误是将我的所有方法都放在RadioStation.m中,并且只将我的变量放在radioStation.h上 因此,当我在ViewController.m上导入radioSation.h并尝试定义按钮时单击我的应用程序的方法,这是问题开始的地方。 我收到错误/警告“ARC语义问题:每次构建或运行应用程序模拟器时,没有可见的@interface for Class声明选择器。”

我的解决方案是回到RadioStation.h文件,然后在那里声明我的所有方法。 因为他们已经在RadioStation.m上定义了,所以我很高兴。

因此,请确保已在要在viewControllers上导入的文件上正确声明了方法。 希望有所帮助。

答案 4 :(得分:1)

在我的情况下,我在

中有一些非常奇怪的路径条目
  • 框架搜索路径
  • 图书馆搜寻路径

(目标 - > YOUR_APP_NAME - >“搜索路径”部分中的构建设置)

我删除了它们,错误消息消失了。