在我的项目中,我正在使用它自过去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中使用它们。
答案 0 :(得分:2)
首先,如果你有一个URL,请使用NSURL来引用它。
其次,以一致且描述性的方式命名您的全局变量。 AliRootURL
和AliLoginURL
具有描述性,并且有一个前缀(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: