【问题标题】:"Cannot find interface declaration for NSObject"?“找不到 NSObject 的接口声明”?
【发布时间】:2012-01-24 22:04:36
【问题描述】:

所以我对这个问题做了一些研究,但我还没有发现任何类似的东西......

所以我正在使用 Xcode 和 Sparrow 框架在 Obj-C 中编写游戏。到目前为止,我一直在使用模拟器,一切都很好。但是当我切换到在我的设备上运行它时,我会遇到各种应该是标准的错误,例如“找不到 NSObject 的接口声明”、“未知类型名称 'NSMutableArray'”等。我已经在每个类中都有 #import,所以你会认为它不应该发生,对吧?我觉得只是一两行需要在某个地方更改 - 但我不知道是什么或在哪里。

如果有人有任何建议,将不胜感激。 :)

编辑:这是给出错误的 .h 文件之一的屏幕截图 - 它似乎只存在于我创建的一些 .h 文件中。 http://i.imgur.com/EuQh4.png

【问题讨论】:

  • 听起来 Foundation 不是以某种方式导入的。尝试将 #import <Foundation/Foundation.h> 添加到您的 prefix.pch 以查看它是否清除了警告。
  • 刚刚检查了 Application_Prefix.pch - 它已经在里面了,还有 和 "Sparrow.h" O.o
  • Foundation 是否列在您的框架文件夹中?您是否在目标设置中链接到它?
  • 第一个问题是的,我对第二个问题一无所知 XD 抱歉,Obj-C/Xcode 还是有点绿色。
  • 好的,刚刚检查了 Linked Frameworks and Libraries - 我希望这就是你所说的 - 我看到 Foundation.framework 在那里。

标签: objective-c ios xcode sparrow-framework


【解决方案1】:

这可能是由于不包含 UIKit 造成的。

将此添加到您的标题中:

#include <UIKit/UIKit.h>

还要确保将 UIKit 框架添加到您的项目中。 (目标/构建阶段/使用库链接二进制文件/ -- 选择添加 --- 添加 UIKit.Framework)

【讨论】:

  • 新的 Xcode 似乎默认不包含 UIKit 框架。
  • 是的,这对于 Xcode 6 和 iOS 8+ SDK 非常重要。
  • 这实际上是因为 Xcode 项目曾经包含一个包含 #include 的 prefix.pch 文件,但现在它们不包含了。
【解决方案2】:

听起来您的某个头文件中可能有循环引用。

这可能发生在 foo.h #imports "bar.h" 和 bar.h #imports "foo.h" (或者有时它是一个由三个或更多头文件组成的链,在一个圆圈中相互导入)并且它导致像你看到的那样的虚假错误。

解决方案是尽量避免在 .h 文件中导入标头,而是在 .h 文件中对外部类使用 @class 引用,并将 #imports 放在 .m 文件中。所以不要写:

#import "SomeClass.h"

在你的 .h 文件中,尽可能放:

@class SomeClass;

在您的 .h 文件中,并将 #import 语句放在您的 .m 文件中。

【讨论】:

  • 嗨,我试了一下,似乎可以解决大部分错误,谢谢!奇怪的是,我检查了循环引用,似乎没有任何我能看到的......而且,似乎还有一些剩余(我们已经从 20 多个错误减少到 5 个),但我会坚持下去。再次感谢:)
  • 不过,我还是不明白。当我使用 import 语句(而不是 include)时,应该处理和防止多重包含,这就是为什么我真的看不出这种行为的可能原因。
  • @Novellizator import 语句防止同一个文件被多次导入,但它不能解决循环包含:假设文件 A 导入文件 B,文件 B 导入文件 A;在文件 B 尝试再次导入时,文件 A 尚未完全导入,如果文件 B 需要在 import B 语句之后引用文件 A 中声明的内容,那么它不能因为它没有解析那部分还没有。
【解决方案3】:

在 Cocoa 或 iOS 应用程序中尝试此方法,确保在继承 NSObject 类的类中导入“Foundation/Foundation.h”。

【讨论】:

    【解决方案4】:

    尝试删除项目的派生数据。您可以通过组织者在项目下做到这一点。您可能有一个损坏的预编译标头。

    【讨论】:

    • 刚刚试了一下,虽然它不会让我删除任何派生数据。按钮是灰色的,所以我猜一开始就没有?
    • 好吧,那可能不是,但以防万一,去/Users/&lt;username&gt;/Library/Developer/Xcode/DerivedData找到项目文件夹,然后删除它。如果您不确定哪个是正确的,可以安全地删除此处的所有文件夹,Xcode 只需要重新索引您的源文件。
    • 去看看,但一开始就没有数据。这有点神秘!
    • 它可能不适用于 OP,但它对我有用!谢谢!
    【解决方案5】:

    我遇到了类似的错误,当我注意到我做了一些非常愚蠢的事情时解决了它。

    在我的foo.m 文件中,我忘记了#import "foo.h"

    当我添加导入行时,错误得到了修复。

    【讨论】:

      【解决方案6】:

      确保您没有使用已被占用的类名。当我将我的一个类命名为“信号”时,我遇到了同样的问题,它已经是 Foundation 的一部分。

      【讨论】:

        【解决方案7】:

        还要确保您没有包含来自 .cpp 或 .c 文件的 Objective-C 文件。

        示例:PhotoManager.mm 可能包含来自 Objective-C 对 PhotoObject.h/PhotoObject.mm 的头文件。 那么,如果MyAwesomeCppFile.cpp 包含PhotoManager.h,突然PhotoObject.h 不知道基本的Objective-C 类和关键字。

        如果你能侥幸成功,一个解决方案是使用#ifdef __OBJC__。

        否则,在文件的属性面板中将.cpp 文件类型指定为Objective-C++ Source(右上角的窗口控件=>“身份和类型”)

        【讨论】:

          猜你喜欢
          • 2015-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 1970-01-01
          • 1970-01-01
          • 2019-02-23
          • 2016-11-03
          相关资源
          最近更新 更多