【问题标题】:ARC Semantic Issue: No visible @interface for Class declares the selectorARC 语义问题:没有可见的 @interface 类声明选择器
【发布时间】:2013-05-08 02:51:25
【问题描述】:

相当基本的东西,但我无法解决问题所在。在我的项目中,我有一个名为“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];

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

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

2) 我检查了 10 次,没有错字。

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

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

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

【问题讨论】:

  • 你有没有 #import 进入你遇到这个错误的班级?
  • 当然我已经导入了课程。它无法识别这些方法,当我输入 [[TheFeedStore sharedStore] 时,即使是“sharedStore”类方法也会出现在自动完成列表中
  • TheFeedStore.h 文件中有什么?您是否在 .h 中声明了这些实例方法?
  • @ThilinaHewagama 是的,这些方法也在头文件中声明
  • 他是在确认你没有这样做,而不是建议你应该这样做。

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


【解决方案1】:

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

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

执行此操作时,有时 Xcode 仍在使用少数文件的旧副本。这意味着当您尝试访问的方法未被您声明时,它仍在使用 TheFeedStore.h 的旧副本。

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

在右侧的实用程序部分,检查“身份和类型”区域下的位置和完整路径。

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

如果此名称与您的项目名称相同,那么我的回答并不能解决您的问题。如果不同,您应该使用红色箭头所指的标志浏览新位置来使用文件的新副本。

浏览并使用新文件后,您的问题将得到解决,您将能够访问这些方法。如果还是不行,复制这些文件,从项目中删除,然后重新添加,就不会遇到这个问题了。

希望这会有所帮助!

【讨论】:

  • 这是一个非常好的建议:) 虽然它并没有解决我的问题:) 但至少指出这个错误可能是由(这里放置正确的描述)XCode 引起的。在项目树中,我有一个具有最新方法的类,但是当我从发生错误的类中的导入语句跳转时,它会将我带到一些旧版本的类 - 并且“实用程序”面板中显示“不适用” .
【解决方案2】:

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

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

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

【讨论】:

  • 1) 我使用前向声明而不是导入语句。 2)在产品 > 生成输出中,有这个选项用于预处理文件,但它生成了一个非常长的文件,我不知道如何检查我的问题
  • 当我使用预处理文件选项时,错误消失了,它给我一个长文件。再次运行程序会返回错误
  • @AJ112 也许你应该先了解预处理器,尤其是导入和包含是如何工作的。
【解决方案3】:

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

【讨论】:

  • 我已经清理了,重新启动了 xcode,重置了模拟器,它没有工作。正如你所说的“这可能听起来很傻”:D
  • 也许你可以把你项目的一部分上传到某个地方让我看看?
  • 我在这里添加了单例类的代码gist.github.com/jessicamoore112/5558473
  • 对我来说看起来还可以,但并不能说明太多。我宁愿看到更多代码来尝试这个,包括单例的 .h 和 .m 文件以及您使用它的类。也许您可以上传项目中不起作用的部分或类似的东西?
【解决方案4】:

伙计们,我遇到了完全相同的问题。在 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 的文件中正确声明了方法。 希望有帮助。

【讨论】:

    【解决方案5】:

    在我的情况下,我在

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多