我有一个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类型的崩溃。如果您想稍后使用该字符串,请copy
或retain
它以获得对该字符串的所有权。你可能希望在应用委托的 dealloc
方法中释放它(或在为全局变量分配另一个值之前)。
对于 @"XYZZY"
,你使用的是常量字符串文本,该文本在整个应用生存期内保留在内存中。这就是为什么它按预期工作的原因。