.m文件如何查看另一个.m文件中声明的变量?

时间:2016-08-25 08:02:23

标签: ios objective-c

我正在编译我的程序,但在链接阶段,我收到错误:

ld: 1 duplicate symbol for architecture x86_64

我有两个不同的类,每个类在@implementation内的.m文件中包含一个变量(当然我知道哪一个)。 如果我更改其中一个的名称,它就可以了。 在this link我看到.m中声明的内容是“私有的”,所以我不明白这个错误来自何处以及如何修复它。

注意 - 让我的问题更清晰: 假设我有一个班级EiffelTower和另一个班级NiceGreenMonkey,他们都是NSObject的子类,他们都有一个变量mAge(在现实生活中它是{{1} }})。

我应该在哪里以及如何声明该变量((NSMutableDictionary *) someData)以便我不会收到错误?

1 个答案:

答案 0 :(得分:0)

由于您没有包含任何代码,这只是一个猜测:如果您在(Objective-)C文件中声明一个全局变量,那么编译后的二进制文件将该全局变量作为公共符号。如果对不同文件中的全局变量使用相同的名称,然后尝试将已编译的二进制文件组合到同一个应用程序中,则会从链接/加载器(错误中的ld)中获得重复的符号错误。

(请注意,这与语言级别的两个变量的可见性无关,在编译文件时不采取措施使变量可见,编译器不允许您在另一个文件中引用变量文件,因为它只是不会看到它。)

要防止使用与其关联的公共符号定义的全局范围定义的变量,可以将修饰符static添加到其声明中。这会将变量的可见性限制在该语言和已编译的二进制级别的文件中。

对评论的回应

您的变量是实例变量,如果它们存在错误,您将无法获得错误。所以我猜错了,你错误地声明了你的实例变量。这就是为什么在提问时应始终包含代码的原因。我能做的就是再次猜测。这是实例变量声明应该是什么样的:

@implementation SomeClass
{  // open brace indicates start of instance declarations
   int birdCount; // an instance variable
   // ...
}  // close brace, end of instance variables

// methods...

@end

你错过了牙箍吗?如果你有,那么你已经声明了全局变量而不是实例变量。

如果这个猜测仍然存在错误编辑您的问题并添加您的代码!您很幸运SO社区尚未关闭您的问题,您需要帮助人们为您提供帮助。

HTH