在Objective-C中使用Singleton时链接器错误

时间:2012-06-21 20:55:43

标签: objective-c linker singleton linker-errors

尝试实例化单例时,我的链接器命令失败,退出代码为1(使用-v查看调用)错误。

这是我用来使我的课成为单身人士的代码:

·H

@interface CoursesManager : NSObject
{

}
+ (id)SharedInstance;
@end

的.m

@implementation CoursesManager

+ (id)SharedInstance
{
     static dispatch_once_t once;
     static id sharedInstance;
     dispatch_once(&once, ^{
     sharedInstance = [[self alloc] init];
     });

     return sharedInstance;
}
@end

这就是我在其他课程中使用它的方式:

coursesManager = [CoursesManager SharedInstance];

在进一步了解之后,似乎只是在其他.m中导入此文件会导致链接器错误。我对这可能导致什么感到困惑。任何帮助将不胜感激。

仅供参考,我正在使用Xcode 4.3.3。

编辑错误的完整评论如下:

ld:在../Objects-normal/armv7/CourseEditorViewController.o中的重复符号_MAX_COURSES和用于架构armv7的... / Objects-normal / armv7 / CourseSelectionViewController.o clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

在@interface CoursesManager之上,我已经声明了两个const int变量,MAX_COURSES和MAX_HOLES。

2 个答案:

答案 0 :(得分:0)

@end的实施结束时,您有CourseManager.m吗?

您是否导入CourseManager.h文件中的任何文件?如果是这样,请确保您导入的文件中没有任何文件包含CourseManager.h的导入语句(即两个文件互相导入)。

仅供参考,这是创建单身人士的推荐且线程安全的方式:

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

<强>更新

出现错误是因为@rkeller在他的CourseManager.h文件中声明了const int值,然后将该.h文件导入到其他一些文件中。

为避免这种情况,您可以采取以下措施:

  1. const int切换为#define
  2. const int切换为static const int
  3. CourseManager.h中的值声明为extern const int MyConstant,然后将CourseManager.m中的值实例化为:const int MyConstant = 0;
  4. 在头文件中声明非静态常量时,编译器会将该常量视为导入该头文件的每个文件的独立全局。然后,当链接器尝试链接所有已编译的源时,它将多次遇到全局 - 因此链接器错误。

答案 1 :(得分:0)

  

似乎只是在其他.m中导入此文件会导致链接器错误。

你做不到。您的文件中包含一个静态变量和实现。静态变量对于链接器来说不是问题,因为您导入的每个.m文件都有自己的cm实例(不是您想要的)但是您也会得到重复{{1这可能是导致链接器错误的原因。

将界面放入头文件并在任何地方导入。实现和静态变量放在单独的@implementation文件中。