尝试实例化单例时,我的链接器命令失败,退出代码为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。
答案 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文件导入到其他一些文件中。
为避免这种情况,您可以采取以下措施:
const int
切换为#define
const int
切换为static const int
CourseManager.h
中的值声明为extern const int MyConstant
,然后将CourseManager.m
中的值实例化为:const int MyConstant = 0;
在头文件中声明非静态常量时,编译器会将该常量视为导入该头文件的每个文件的独立全局。然后,当链接器尝试链接所有已编译的源时,它将多次遇到全局 - 因此链接器错误。
答案 1 :(得分:0)
似乎只是在其他.m中导入此文件会导致链接器错误。
你做不到。您的文件中包含一个静态变量和实现。静态变量对于链接器来说不是问题,因为您导入的每个.m文件都有自己的cm
实例(不是您想要的)但是您也会得到重复{{1这可能是导致链接器错误的原因。
将界面放入头文件并在任何地方导入。实现和静态变量放在单独的@implementation
文件中。