2009-02-27 54 views
0

我有一个全局变量的类1像 classA.h问题声明目标C全局变量

const NSString *global; 

classA.m

global=[array objectAtIndex:0];//a array store sort of string 

,并在另一个类,我想调用这个全局变量

classB.m

import "class.h" 

NSLog(@"%@",global); 

但它不工作,我知道我什么时候直接给我的全局变量赋值而不是从另一个变量它会工作,但有人可以告诉我如何使它从数组中实现?

+1

我建议你重新考虑使用全局变量。可能有更好的选择。如果你使用这些类进行并发编程,你会后悔使用全局变量。 – sebnow 2009-02-27 04:30:32

回答

3

在标题中使用:

extern const NSString *global; 

,并在实现(.M):

const NSString *global; 

的 “外部” 参照告诉变量始终存在,包括文件,但它的声明别处。最后,在你的实现文件中,你把实际的声明。

+1

最好使用NSString * const global,因为编译器在将一个指向NSString的常量指针作为参数传递给一个期望非常量指向NSString的方法的参数时不会发出警告。 – dreamlax 2009-02-27 04:31:07

1

你不能这样做。

const NSString *global; 
NSString const *global; 

既意味着一个指针(可改变的)到一个恒定NSString对象。在Objective-C中,常量对象是没有意义的。编译器不能强制执行对象的常量。它不能知道一种方法是否改变对象的内部状态。同样,库中的所有类都将指向非常量对象的指针作为其方法的参数,因此具有任何const对象指针都会导致很多警告。

在另一方面也有固定对象的指针被声明如下:

NSString * const global; 

这意味着该指针指向一个普通的NSString对象,但它的价值不能被改变。这意味着你还必须初始化指针的值(以后不能更改)。这用于定义常量。但这只适用于NSStrings和字符串文字。对于所有其他类,无法指定初始化所需的编译时常量对象。在这种情况下,它是一个真正的常量 - 字符串文字根据定义是不可变的。

但在你的情况下,你可以取消const。你想稍后改变指针,所以它不能是NSString * const。如果你坚持一个全球化,你只需要把它定为一个常规的NSString *。另一方面,全局变量是邪恶的。你应该改变你的设计,所以你不需要它。