我有一个globals.h和我的appdelegate.h和m。
在globals.h中我有:
extern NSString *databasePath;
NSString *databasePath;
在appdelegate.m中的我分配一个值并打印出来:
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
NSLog(@"Database is:%@", databasePath);
到目前为止一切都很好。当我调用另一个类并以与数据库路径消失相同的方式显示数据时。
但是,如果我像这样指定databasePath,那么它可以工作,我可以使用NSLog来显示值:
databasePath =@"XYZZY";
我做错了什么?
答案 0 :(得分:2)
你的问题有点模棱两可,所以我在这里给你两个答案。您可能想澄清一下您的问题。 :)
其他人似乎在假设您的班级中有NSString *database
。但是我会从表面上看你的问题,并假设你在appdelegate.h中放松了。
(顺便说一下,这使得这是一个C问题,而不是Objective-C问题。)
正在发生的事情是,每次导入appdelegate.h时,最终负责导入的.m文件都会获得它的新副本。
你也应该在appdelegate.h中拥有extern
。非extern NSString *database
必须位于.m文件中。
另一种可能性当然是你班上确实有NSString *database
。这使它不是一个全局变量,而是一个实例变量。您不能在另一个标头中使用extern NSString *database
将其声明为全局。那么,您正在做的是在AppDelegate中设置实例变量并从其他类访问同名的全局变量。
完全删除全局,只需使用您的AppDelegate。您可以使用访问器阅读它。
类似的东西:
id appDelegate = [[UIApplication sharedApplicaiton] delegate];
id databasePath = [appDelegate databasePath];
答案 1 :(得分:1)
[documentsDir stringByAppendingPathComponent:databaseName]
返回一个无主字符串。在您稍后尝试使用它之前,它将从内存中擦除。在一般情况下,这可能会导致EXC_BAD_ACCESS类型的崩溃。
如果您希望稍后使用该字符串copy
或retain
来获取该字符串。您可能希望在app delegate的dealloc
方法中释放它(或者在为全局变量分配另一个值之前)。
在使用@"XYZZY"
的情况下,您使用的是一个常量字符串文字,它在整个应用程序生命周期内都会在内存中保留。这就是它按预期工作的原因。