0

我的程序中有 2 个类,第一类是 class1,第二类是 class2。我想在类 1 中创建和初始化全局变量并在类 2 中使用,但编译器给了我这个错误 XD:

Undefined symbols for architecture i386:
  "_saeid", referenced from:
      -[class2 viewDidLoad] in class2.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在 class1 中创建全局变量并以这种方式在 class2 中运行它,但不起作用:

类1.h

extern int saeid;   // this is global variable

@interface class1 : UITableViewController<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic,strong) IBOutlet UITableView *table;

@end

类1.m

#import "class1.h"
#import "class2.h"

@implementation class1
{
    int saeid;
}
@synthesize table;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{  
    int x = (indexPath.row)+1;
    saeid = x;                      //initialize global variable 
    NSLog(@"X & SAEID: %d & %d",x,saeid);
}

类2.h

#import "class1.h"

@interface class2 : UIViewController<UIScrollViewDelegate>
{    
}

@end

类2.m

#import "class2.h"

@implementation class2
{
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Saeid in class2 : %d",saeid);

}
4

2 回答 2

1

这里似乎有些混乱。最重要的是,全局变量不能“在”类中——根据定义,全局变量在任何类之外。因此,如果您真的想要一个全局变量(稍后会详细介绍),那么您需要将int saeid;class1.m 中的定义放在类定义之外,并将其放在文件级别。

完成之后,事情仍然无法编译。该语句extern int saeid;粗略地对编译器说:“我在其他地方定义了一个名为 saeid 的整数,所以只要假装它存在,让链接器弄清楚如何连接它。” 没有理由在 class1.h 中有这个语句,因为这个全局变量在该文件的任何地方都没有使用。相反,您应该将此 extern 语句放在 class2.m 的顶部附近。它在该文件中使用,因此您需要确保编译器在编译该文件时在某处定义了该变量。

这些步骤应该可以编译您的代码。但是现在你应该停下来想想你是否真的想要一个全局变量。全局变量将您的类联系在一起,并且很难在不影响(并可能破坏)其他类的情况下进行更改。它们使测试代码变得更加困难,并且使阅读代码更加混乱。这里要考虑的另一个选项是创建 saeid 作为class1类的属性,并将class1*属性添加到class2. 然后,当您创建class2实例时,传递一个指向现有class1实例的指针。实例可以保留该class2指针并根据需要使用它来访问 saeid 属性。

于 2013-04-07T08:18:07.743 回答
0

在 Objectice-C 中你不能有类变量,只有实例变量。

如果你想拥有一个全局变量,你会写:

#import "class1.h"
#import "class2.h"

int saeid;

@implementation class1
{
}
@synthesize table;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{  
    int x = (indexPath.row)+1;
    saeid = x;                      //initialize global variable 
    NSLog(@"X & SAEID: %d & %d",x,saeid);
}

但这只是一个全局变量,与类无关!

于 2013-04-07T08:07:43.833 回答