Objective c 在运行我的应用程序后,我一直存在此问题

Objective c 在运行我的应用程序后,我一直存在此问题,objective-c,ios,Objective C,Ios,我不知道为什么,但在工作了一段时间后,我添加了一些按钮,然后启动了我的应用程序,出现了以下错误: ld:重复符号x in /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos ayjpqqcjajbhuzvbkvernzsunpbe/Build/Intermediates/RecolectaDatos.Build/Debug iphonesimulator/RecolectaDatos.Build/Objects

我不知道为什么,但在工作了一段时间后,我添加了一些按钮,然后启动了我的应用程序,出现了以下错误:

ld:重复符号x in /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos ayjpqqcjajbhuzvbkvernzsunpbe/Build/Intermediates/RecolectaDatos.Build/Debug iphonesimulator/RecolectaDatos.Build/Objects normal/i386/SeconViewController.o 和 /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos ayjpqqcjajbhuzvbkvernzsunpbe/Build/Intermediates/RecolectaDatos.Build/Debug iphonesimulator/RecolectaDatos.Build/Objects normal/i386/ViewController.o 对于体系结构i386,clang:错误:链接器命令失败,退出 代码1(使用-v查看调用)


每当我出现重复符号错误时,几乎总是因为我的标题中有一个循环导入。解决方案非常简单,尽可能使用前向声明,并从.m文件导入.h文件

只有两种情况需要从另一个导入一个.h:

  • 如果要在#导入中扩展类
  • 您正在#导入中实现协议
  • 具体来说,您不需要仅为了在签名中使用类名或协议而导入文件;而是使用前向声明

    例如,这(单位:Bar.h):

    可能会变成这样(Bar.h):

    和bar.m:

    #import "Foo.h"
    
    这里是一个链接

    “复制符号”消息表示您在同一范围内两次声明某个名称(在本例中为
    \u x
    )。假设您有这样的代码:

    int _x = 1;
    int _x = 2;
    
    那么你会期望得到一个错误,对吗?您可以在同一时间为两件事使用相同的名称

    您得到的错误本质上是相同的。您在某个地方声明了
    \ux
    ,从编译器的角度来看,您做了两次。有几种方法可以解决这个问题,具体取决于
    \ux
    所代表的内容

    chrahey的回答解释了转发类声明。我在这里不再赘述,只想说转发声明有助于解决循环引用,其中类a的定义取决于类B,反之亦然

    如果
    \ux
    是一个变量,则很可能您正试图在头文件中声明它。编译器基本上会复制导入源文件的每个头文件的内容,因此,如果在头文件中声明一个变量,然后将该头文件导入两个或多个实现文件,那么最终将得到该变量的多个声明。要避免这种情况,请使用
    extern
    关键字告诉编译器“此名称将在其他地方声明”,然后将真正的声明放入实现文件中:

    Foo.h:

    extern int _x;
    
    int foo(int a);
    
    富美

    函数也是如此。似乎
    \ux
    不是一个函数,但如果它是一个函数,并且如果您愚蠢到将函数定义放在头文件中,那么如果将该文件导入到多个实现文件中,您将再次遇到错误。这就是头文件包含原型而不是定义的原因:

    Foo.h:

    extern int _x;
    
    int foo(int a);
    
    富美


    “使用前向声明”是什么意思?如我的回答所示,Objective-C允许您告诉编译器类或协议“将在运行时存在”,或者基本上是“不要抱怨找不到此类”。语法非常简单,只需使用
    @class Foo告诉编译器“相信我,有一种类型是Foo,它是一个类”,以及“@protocolfoodegate;”表示“相信我,有一个名为“FooDelegate”的协议。这些协议允许您在方法签名和@property声明中使用这些标识符,而无需导入它们实际存在的文件。我仍然存在问题…链接器命令失败,退出代码为1(使用-v查看调用)关于
    复制符号x
    的位置是否相同?以及,您是否彻底删除了应用程序所有角落的导入声明(如果可能)?
    int foo(int a);
    
    int foo(int a)
    {
        return a + 10;
    }