Objective C iPhone中的全局变量

3

我在我的appdelegate类中加载了一些变量。它们在我的.h文件中声明。

我有一个global.h文件,用extern声明了相同的变量,例如:

appdelegate.h

NSString *DBName;

global.h

extern NSString *DBName;

我还没有找到规律,但是我包括了global.h文件的一些类的变量却是nil。

你有什么想法是我做错了什么吗?

编辑:

看起来像这样的变量:

int x;

粘性指针是可用的,但指向变量的指针会丢失:

NSString *Name;

他们最初都从应用程序委托中的数据库中加载。
我也尝试过声明。
char Name[30];

然后将其分配,一切都很好。
那么接下来呢?

我已经看过了,但是我无法通过编译错误,所以放弃了。我认为这很简单,但编译器似乎不喜欢它? - Mark Worsnop
为什么它不是nil?你在哪里设置它? - hooleyhoop
3个回答

4
在 .h 文件中:
 extern NSString *global;

在某个.m文件中:

 NSString *global = @"foobar";

如果你需要在运行时设置全局变量,你需要在某个方法中这样做;比如说,在applicationDidFinishLaunching:方法中。
在NSString的情况下,你在哪里分配全局变量?当你这样做时,你是否保留了值?你所说的“丢失”是什么意思?
请注意,该变量不能被声明在.h文件中;extern应该在.h文件中,NSString *global;必须在一个且仅一个.m文件中。

是的,我已经在主应用程序代理中加载了变量。它们在那里都很好。请参见上面的额外注释。 - Mark Worsnop
@Mark Worsnop:你的问题中提到你把变量放在了“appdelegate.h”文件中,而bbum建议将其放在“某个.m文件”中。 - Chuck
我已经在.m文件中设置了这些值,但是我注意到上面的注释中有一个"retain"。我没有明确告诉它保留这些值,也许这就是问题所在?我该怎么做呢? - Mark Worsnop

1
你正在使用什么类型的变量?它们是原始数据类型还是对象?如果是原始数据类型,你可以考虑使用预处理器定义语句而不是全局变量。
如果是对象,你可能想要创建一个 Global 类的实现,并使用 Singleton 实例来提供和设置变量。类似于以下代码:
@implementation Global
static Global *myGlobal = nil;

+(Global *)sharedInstance
{
    if (myGlobal == nil) {
         myGlobal = [[self alloc] init];
    }
    return myGlobal;
}

@end

然后您可以使用以下方式调用变量:

[[Global sharedInstance] variableName]  

请查看我上面添加的初始消息。看起来指针是问题所在。例如NSString *Name; - Mark Worsnop
如果你只有一个.h文件和在其中定义的NSString,你应该创建一个.m文件。你不必使用单例实例,但对于这些对象,你需要定义它们。我建议你为每个OBJECT添加以下内容:Class *variable = nil;。因此,例如,在你的.m文件中放置NSString *DBName = nil;。 - xianritchie
我已经做了那个,但是我觉得我需要“保留”这个NSString。我该怎么做? - Mark Worsnop
通常在初始化变量时会保留它。对于字符串,你需要声明DBName = [[NSString alloc] init];。如果你使用了DBName = [NSString initWithString:(NSString *)aString]或其他辅助初始化器,则NSString在声明时被分配了自动释放池,并在循环中被释放。你应该在初始化字符串时使用[[alloc] init]。 - xianritchie

0
问题在于NSStrings没有被保留。@xianritchie在上面的评论中提出了这个建议。我改变了我拥有的一些全局字符串,现在一切都很好。
感谢大家的帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接