0

尝试实例化单例时,链接器命令失败,退出代码为 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 和 .../Objects-normal/armv7/CourseSelectionViewController.o 中的重复符号 _MAX_COURSES 用于架构 armv7 clang:错误:链接器命令失败,退出代码为 1(使用 -v查看调用)

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

4

2 回答 2

0

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

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

将接口放入头文件并在任何地方导入。实现和静态变量放在一个单独的.m文件中。

于 2012-06-21T21:12:58.553 回答
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;
}

更新

出现错误是因为@rkellerconst int在他的 CourseManager.h 文件中声明值,然后将该 .h 文件导入到其他几个文件中。

为了避免这种情况,您可以做一些事情:

  1. 切换const int#define
  2. 切换const intstatic const int
  3. CourseManager.h在as中声明值,extern const int MyConstant 然后CourseManager.m像这样实例化值:const int MyConstant = 0;

当您在头文件中声明一个非静态常量时,编译器将该常量视为导入该头文件的每个文件的独立全局变量。然后,当链接器尝试链接所有已编译的源时,它将多次遇到全局 - 因此出现链接器错误。

于 2012-06-21T21:01:21.507 回答