外部变量初始化

时间:2013-05-24 16:15:43

标签: objective-c extern

在我的项目中,我正在使用它自过去6个月以来,我使用#define来定义FileManager类中的所有URL。但现在我知道我必须使用两个不同的URL依赖于条件所以动态我无法更改#define values.so我决定在FileManager类中使用extern变量而不是#define。

如           在接口文件

       extern NSString *Url;
       extern NSString *loginUrl;

在m档案中

        @implementation UrlManager
        + (void) initialize{
        Url=@"http://xxxxxxxxxx.com";
        loginUrl=[NSString stringWithFormat:@"%@%@",Url,@"/ipad.php?method=audLogin&username="];
             }

但是当我导入URLManager.h并使用loginUrl时,仍然是null,请帮助我如何初始化extern变量以便我可以在app中使用它们。

1 个答案:

答案 0 :(得分:2)

首先,如果你有一个URL,请使用NSURL来引用它。

其次,以一致且描述性的方式命名您的全局变量。 AliRootURLAliLoginURL具有描述性,并且有一个前缀(Ali - 更改它),以便于识别。

最后,根本不要使用全局变量。相反,在URLManager类(实际上也应该加上前缀)上有类方法来返回URL:

@interface AliURLManager:NSObject
+(NSURL*)rootURL; // no need to prefix methods in your custom classes
+(NSURL*)loginURL;
@end

这样,您可以实现这些方法以直接返回URL:

+(NSURL*)rootURL
{
     // use a static and dispatch_once() if you want only one instance
     return [NSURL URLWithString:@"http://foobar.com/"];
}
+(NSURL*)loginURL
{
     NSURL* root = [self rootURL];
     NSURL* loginURL;
     ... calculate loginURL here... (http://stackoverflow.com/questions/718429/creating-url-query-parameters-from-nsdictionary-objects-in-objectivec)
    return loginURL;
}

这样,您可以轻松地将代码重构为,例如,从默认数据库中读取URL或具有不同的开发配置。


糟糕 - 但我能理解不改变大量文件的愿望。应该是搜索和可替换的(至少,如果你的变量更具描述性)。

如果要通过+initialize初始化全局变量,则需要确保该类被发痒。将[URLManager class];添加到您的applicationDidFinishLaunching: