Objective c 访问全局变量时出现问题?

Objective c 访问全局变量时出现问题?,objective-c,linker-errors,Objective C,Linker Errors,在我的DataCell.h中,我在接口之前声明了全局变量: extern NSInteger MYGlobalVariable; 在我的DataCell.m中 我设置变量的值: NSInteger MYGlobalVariable = 35; 在我的另一个类中,MyTableViewController.m @synthesize datacell; _testLabel.text = [NSString stringWithFormat:@"%i" , dataCell.MYGlobal

在我的DataCell.h中,我在接口之前声明了全局变量:

extern NSInteger MYGlobalVariable;
在我的DataCell.m中

我设置变量的值:

NSInteger MYGlobalVariable = 35;
在我的另一个类中,MyTableViewController.m

@synthesize datacell;

_testLabel.text = [NSString stringWithFormat:@"%i" , dataCell.MYGlobalVariable];
我导入了DataCell.h,然后尝试将int的值设置为标签

_testLabel.text = [NSString stringWithFormat:@"%i" , MYGlobalVariable];
但是,当我尝试构建应用程序时,会出现以下错误:

  • 架构i386的未定义符号:“\u MYGlobalVariable”,引用自:MyTableViewController
  • 错误:链接器命令失败,退出代码为1(使用-v查看调用)

    • 您不需要在DataCell.h文件中写入extern关键字

      只需将其声明为
      NSInteger MYGlobalVariable在接口之前,然后在TableViewController.m文件中声明一个变量
      extern NSInteger MYGlobalVariable


      这会有用的

      您需要通过执行以下操作将变量传递给类

      MyTableViewController.h

      #import DataCell.h //At top...
      
      @property (strong, nonatomic) DataCell *datacell;
      
      MyTableViewController.m

      @synthesize datacell;
      
      _testLabel.text = [NSString stringWithFormat:@"%i" , dataCell.MYGlobalVariable];
      

      根据你上面所说的,你做的一切都是对的。因此,我怀疑上面的一个细节与您的代码不匹配

      extern
      声明是否与变量声明匹配?(例如,您没有意外地将其拼写不同,等等)

      .m中的变量声明是否意外地以
      static
      关键字作为前缀

      您的
      NSInteger MyGlobalVariable=35
      行是否实际位于方法内部?如果是这样的话,那就是为该方法声明一个局部变量。确保它不在任何花括号内;它应该在文件的最外层浮动。如果有帮助,可以将其放在
      @实现
      块之前



      如果这些都不能解决问题,那么您可能需要向我们展示您的实际代码,以便我们更好地了解出了什么问题。

      是否通过静态库导入了
      DataCell.h
      ?@EllNeal否。它是在
      DataCell.m
      中定义的。而不是在MyTableViewController.h中导入DataCell.h。您在DataCell.m中到底在哪里定义了这个变量?我猜您实际上没有在全局范围内定义它。您可以将
      MYGlobalVariable
      声明为
      DataCell
      MYGlobalVariable不是DataCell的属性!!当我这样做时,我得到一个错误:在对象类型DataCell*上找不到MYGlobalVariable*您是否确保
      NSInteger MYGlobalVariable=35
      @implementation
      中?否,这将为导入它的每个人创建一个单独的全局变量。如果有多个.m文件导入该文件,则会由于多个全局变量具有相同的名称而导致链接器错误。正确;外部不生成多个全局变量。但将非外部声明放在头中是个问题;导入该头文件的每个文件基本上都会将entre头文件粘贴到其.m文件中,由于头文件中的腐蚀并没有说
      extern
      ,所以每个文件都会尝试声明自己的副本;您希望导入的头中包含
      extern
      版本,并且只需要实际非extern声明的一个副本。警察说他们就是这么做的,我查过了!我没有犯错误!根据Objective-C的文件,这就是它的使用方式。否则就是你的愿望了@Burhanuddinsunnelwala这是错误的
      extern
      应该在头文件中,BJ Homer是正确的。你能分享这个文档吗?是的,你是对的,我在方法中声明了变量。但是,如果我不能在方法内部设置数据,那么全局变量有什么意义呢。目前这只是一些静态数据?您可以在方法内部设置它,但必须在方法外部声明它。要设置它,只需
      MyGlobalVariable=28,省略类型名称。就像
      intx=3
      声明一个名为x的新变量,并且
      x=3将一个新值赋给一个名为x的现有变量。您是对的,并且工作正常。还有一个问题,我是否能够以相同的方式使用NSMutable数组?嗯,算是吧。您将无法使用初始值声明可变数组,因为可变数组不是常量。但是您可以不使用初始值声明它(例如,在任何方法之外的
      NSMutableArray*myGlobalArray;
      ),然后在一些
      -init
      方法或其他方法中为它指定初始值。