【问题标题】:ios - Parse Issues in NSObjCRuntime, NSZone, and NSObjectios - NSObjCRuntime、NSZone 和 NSObject 中的解析问题
【发布时间】:2012-08-05 03:56:49
【问题描述】:

我正在使用 AddThis 在我的 iOS 应用中添加共享选项。

我已导入类并将 -fno-objc-arc 标志添加到所有导入的类,因为它们不使用 ARC。

但是,当我尝试运行该应用程序时,我遇到了一系列解析问题,例如:

Expected identifier or '('
Unknown type name 'NSString'
Unknown type name 'Protocol'
...

这些错误发生在 NSObjCRuntime、NSZone 和 NSObject 中。我也包含了必要的框架。有什么想法吗?

如果有帮助,请包含此图片:

【问题讨论】:

  • 您是否要在 c 文件中执行此操作?
  • 不确定你的意思,但库中有一个.c 文件,名为 Base64Transcoder.c
  • 在这里看起来像同样的问题:stackoverflow.com/questions/7654752/…,但没有解决方案。假设我有一个 .c 文件,我该如何解决?
  • 只有当您尝试将 ObjC 框架链接到 C 文件时才会出现问题(至少根据我的经验)。 Base64.c 是否导入任何框架?

标签: ios compiler-errors automatic-ref-counting addthis


【解决方案1】:

当我尝试将 C 代码(.h 和 .c)与 Objective-C 代码混合时,我的项目中遇到了同样的问题。找到问题的原因:

检查您的 .pch 文件以确保每个 Objective-C 框架#import(例如 #import <UIKit/UIKit.h>)都包含在:

#ifdef __OBJC__

#endif

如果它们超出此条件范围,编译器将尝试将 Objective-C 框架导入 C 源代码。

希望对您有所帮助。

【讨论】:

  • 非常感谢,在这里为我节省了一个小时的头痛!您必须想知道问题是否在于您正在尝试将 Objective-C 框架导入到 c 代码中,为什么他们不这么说呢?为什么 XCode 会生成几乎毫无意义的神秘错误消息?不管怎样,谢谢!!!是的,我把我所有的导入都放在了 ifdef 中的 .pch 文件中,一切都奏效了。
  • 不客气。这正是这个社区的价值所在。我从中得到了更多帮助:)
  • 谢谢!追随者,还要确保不要#define NSStrings 或 const。 OBJC 块之外的 NSNumbers!
  • 正是我的问题的原因。谢谢
  • 我没有PCH,我该怎么办?
【解决方案2】:

我刚刚把Base64Transcoder.c的文件名改成了Base64Transcoder.m,现在项目编译好了。我不知道为什么这可以解决问题,但它确实有效。

【讨论】:

  • 我猜是这样。你把你的c文件变成了一个objective-c文件,所以在导入objective-c框架之后就可以了。有趣的部分是 .pch 文件被导入到所有 c 文件以及 obj-c 文件中,因此如果 pch 文件中存在不受保护的 obj-c 导入,您最终会收到这个愚蠢的错误消息。
  • 难以置信。非常感谢。
【解决方案3】:

我遇到了同样的问题,在目标 C 中使用 C 和 C++ 代码,但我没有 .pch 最简单的解决方案是进入您的构建设置 -> 自定义编译器标志并将“Other C Flags”设置为“-x Objective-c”并将“Other C++ Flags”设置为“-x Objective-c++”

这将使用 xCode 7.2 解决问题

【讨论】:

  • C++ 设置对我有用,我的项目没有 .pch 文件和 .c 文件,Xcode 7.2.1。
【解决方案4】:

当我的项目包含 .cpp 文件时,我遇到了同样的问题。

如果 .cpp 文件不包含 ObjectiveC 框架(例如),则它必须是“Default-C++ Source”类型

,

但如果 .cpp 文件具有 ObjectiveC 框架 - 它必须是“Objective-C++ Source”

【讨论】:

    【解决方案5】:

    TLDR:如果您的 PCH 文件正常,请查看您的 CPP 文件头,看看您是否不小心包含了任何 Objective C 对象的头。

    详情: 我得到这个是因为我不小心在 C++ 类头文件中间接包含了一个 Objective-C 类头文件。结构是这样的:

    Compass.h 定义了一个纯 Objective C 类。

    ActionTracker.h 定义了一个理解 Objective C 结构的 C++ 类(通过 ActionTracker.mm)。

    HelloWorld.h 定义了一个纯 C++ 类。

    在我原来的设置中,HelloWorld.h 包含了 ActionTracker.h,但这没关系,因为 ActionTracker.h 还没有包含 Compass.h。后来,我更改了代码并将 Compass.h 包含在 ActionTracker.h 中,然后将其拉入到 HelloWorld.h 中,我得到了这些错误。

    【讨论】:

      【解决方案6】:

      当我尝试将 info.plist 文件从一个目录移动到另一个目录时,我遇到了同样的问题。 这以某种方式触发了 XCode 编辑该目标的构建阶段,并显着增加了“编译源”和“复制捆绑资源”的数量。

      幸运的是,我的项目有多个用于测试的目标(即 App Demo、App Dev、App Local、App 1.1、App 1.2 等)

      所以我只是复制了一个未受影响的目标并将其重命名(也重命名了捆绑标识符和构建方案),这显然解决了我的问题,因为受影响的不是整个项目,而只是那个特定的目标。

      如果您想尝试我的解决方案,请尝试从头开始创建一个新目标,或者复制并重命名任何未受影响的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多