目标 C - iPhone 全局 VaR 变为空



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

在全局中,我有:

extern NSString  *databasePath;

在应用程序代表.h 我有

NSString *databasePath;

在appdelegate.m中,我分配一个值并打印它:

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
NSLog(@"Database is:%@", databasePath);

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

但是,如果我像这样分配数据库路径,那么它可以工作,并且我能够使用 NSLog 来显示值:

databasePath =@"XYZZY";

我做错了什么?

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

C 全局变量不是这样工作的。

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

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

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

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

Objective-C不是这样工作的。

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

完全删除全局,只使用您的应用程序代表。您可以使用访问器读取它。

像这样:

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

[documentsDir stringByAppendingPathComponent:databaseName]返回一个无主字符串。在您稍后尝试使用它之前,它已从内存中擦除。在一般情况下,这可能会导致EXC_BAD_ACCESS类型的崩溃。如果您想稍后使用该字符串,请copyretain它以获得对该字符串的所有权。你可能希望在应用委托的 dealloc 方法中释放它(或在为全局变量分配另一个值之前)。

对于 @"XYZZY" ,你使用的是常量字符串文本,该文本在整个应用生存期内保留在内存中。这就是为什么它按预期工作的原因。

最新更新