iphone global var为null

时间:2011-05-20 16:12:25

标签: iphone objective-c global-variables

我有一个globals.h和我的appdelegate.h和m。

在globals.h中我有:

extern NSString  *databasePath;
在appdelegate.h我有

NSString *databasePath;
在appdelegate.m中的

我分配一个值并打印出来:

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

NSLog(@"Database is:%@", databasePath);

到目前为止一切都很好。当我调用另一个类并以与数据库路径消失相同的方式显示数据时。

但是,如果我像这样指定databasePath,那么它可以工作,我可以使用NSLog来显示值:

databasePath =@"XYZZY";

我做错了什么?

2 个答案:

答案 0 :(得分:2)

你的问题有点模棱两可,所以我在这里给你两个答案。您可能想澄清一下您的问题。 :)

C全局变量不起作用。

其他人似乎在假设您的班级中有NSString *database。但是我会从表面上看你的问题,并假设你在appdelegate.h中放松了。

(顺便说一下,这使得这是一个C问题,而不是Objective-C问题。)

正在发生的事情是,每次导入appdelegate.h时,最终负责导入的.m文件都会获得它的新副本。

你也应该在appdelegate.h中拥有extern。非extern NSString *database必须位于.m文件中。

Objective-C无法正常工作。

另一种可能性当然是你班上确实有NSString *database。这使它不是一个全局变量,而是一个实例变量。您不能在另一个标头中使用extern NSString *database将其声明为全局。那么,您正在做的是在AppDelegate中设置实例变量并从其他类访问同名的全局变量。

完全删除全局,只需使用您的AppDelegate。您可以使用访问器阅读它。

类似的东西:

id appDelegate = [[UIApplication sharedApplicaiton] delegate];
id databasePath = [appDelegate databasePath];

答案 1 :(得分:1)

[documentsDir stringByAppendingPathComponent:databaseName]返回一个无主字符串。在您稍后尝试使用它之前,它将从内存中擦除。在一般情况下,这可能会导致EXC_BAD_ACCESS类型的崩溃。 如果您希望稍后使用该字符串copyretain来获取该字符串。您可能希望在app delegate的dealloc方法中释放它(或者在为全局变量分配另一个值之前)。

在使用@"XYZZY"的情况下,您使用的是一个常量字符串文字,它在整个应用程序生命周期内都会在内存中保留。这就是它按预期工作的原因。