在iOS应用程序中如何存储全局常量?

我的iOS应用程序中的大多数模型都会查询Web服务器。 我想有一个configuration文件存储服务器的基本URL。 它看起来像这样:

// production // static NSString* const baseUrl = "http://website.com/" // testing static NSString* const baseUrl = "http://192.168.0.123/" 

通过评论一行或另一行,我可以立即改变我的模型指向哪个服务器。 我的问题是,在iOS中存储全局常量的最佳做法是什么? 在Android编程中,我们有这个内置的string资源文件 。 在任何活动 (相当于一个UIViewController ),我们可以检索这些string常量:

 String string = this.getString(R.string.someConstant); 

我想知道如果iOS SDK有一个类似的地方来存储常量。 如果没有,Objective-C的最佳做法是什么?

你也可以做一个

 #define kBaseURL @"http://192.168.0.123/" 

在“常量”头文件中,说constants.h 。 然后呢

 #include "constants.h" 

在每个文件的顶部,你需要这个常量。

这样,您可以根据编译器标志在服务器之间切换,如下所示:

 #ifdef DEBUG #define kBaseURL @"http://192.168.0.123/" #else #define kBaseURL @"http://myproductionserver.com/" #endif 

那么,你想声明本地的接口,它涉及到的应用程序范围内的常量文件是不是一件好事。

而且,最好简单地声明一个extern NSString* const符号,而不是使用#define


SomeFile.h

 extern NSString* const MONAppsBaseUrl; 

SomeFile.m

 #import "SomeFile.h" #ifdef DEBUG NSString* const MONAppsBaseUrl = @"http://192.168.0.123/"; #else NSString* const MONAppsBaseUrl = @"http://website.com/"; #endif 

除了省略C ++兼容的Extern声明之外,在苹果公司的Obj-C框架中通常会看到这一点。

如果常量只需要一个文件或函数就可见,那么在*.m static NSString* const baseUrl是很好的。

我定义全局常量的方式:


AppConstants.h

 extern NSString* const kAppBaseURL; 

AppConstants.m

 #import "AppConstants.h" #ifdef DEBUG NSString* const kAppBaseURL = @"http://192.168.0.123/"; #else NSString* const kAppBaseURL = @"http://website.com/"; #endif 

然后在你的{$ APP} -Prefix.pch文件中:

 #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import "AppConstants.h" #endif 

如果遇到任何问题,请首先确保将预编译前缀头选项设置为NO。

你也可以像这样连接string常量:

  #define kBaseURL @"http://myServer.com" #define kFullURL kBaseURL @"/api/request" 
  1. 我在YOURPROJECT-Prefix.pch文件中定义全局常量。
  2. #define BASEURl @"http://myWebService.appspot.com/xyz/xx"
  3. 那么在项目的任何地方使用BASEURL:

     NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"]; 

更新:在Xcode 6中,您将找不到在您的项目中创build的默认.pch文件。 所以请使用Xcode 6中的PCH文件在您的项目中插入.pch文件。

更新:适用于SWIFT

  1. 创build新的Swift文件[empty without class]说[AppGlobalMemebers]
  2. &立即声明/定义成员

    例:

     var STATUS_BAR_GREEN : UIColor = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 1) // 
    1. 如果你想在任何类文件中定义app全局成员,比如说Appdelegate或者Singleton类或者任何类,那么声明给定的成员在类定义之上

我认为另一种方法是简单得多,你只需将它包含在你需要它们的文件中,而不是像.pch前缀文件那样的所有文件中:

 #ifndef Constants_h #define Constants_h //Some constants static int const ZERO = 0; static int const ONE = 1; static int const TWO = 2; #endif /* Constants_h */ 

之后,您将头文件包含在所需的头文件中。 您将其包含在头文件中,以便将其包含在特定类中:

 #include "Constants.h" 

我之前使用过的方法是创build一个Settings.plist文件,并在启动时使用registerDefaults:其加载到NSUserDefaults 。 您可以通过以下方式访问其内容:

 // Assuming you've defined some constant kMySettingKey. [[NSUserDefaults standardUserDefaults] objectForKey:kMySettingKey]; 

虽然我还没有做任何Android开发,这听起来好像这是类似于你所描述的string资源文件。 唯一的缺点是不能使用预处理器在设置之间切换(例如,在DEBUG模式下)。 不过,我想你可以加载一个不同的文件。

NSUserDefaults文档。

全局声明是有趣的,但是对我来说,深刻地改变了代码的方式是拥有全局类的实例。 我花了几天的时间才真正理解如何使用它,所以我在这里快速总结了一下

我使用类的全局实例(如果需要,每个项目1或2),重新组合核心数据访问或一些交易逻辑。

例如,如果你想有一个中心对象处理所有的餐厅表,你创build你的对象在启动,就是这样。 这个对象可以处理数据库访问或者在内存中处理它,如果你不需要保存的话。 它是集中的,你只显示有用的接口…!

这是一个很好的帮助,面向对象和一个很好的方式来获得你所有的东西在同一个地方

几行代码:

 @interface RestaurantManager : NSObject +(id) sharedInstance; -(void)registerForTable:(NSNumber *)tableId; @end 

和对象实现:

 @implementation RestaurantManager + (id) sharedInstance { static dispatch_once_t onceQueue; dispatch_once(&onceQueue, ^{ sharedInstance = [[self alloc] init]; NSLog(@"*** Shared instance initialisation ***"); }); return sharedInstance; } -(void)registerForTable:(NSNumber *)tableId { } @end 

使用它非常简单:

[[RestaurantManager sharedInstance] registerForTable:[NsNumber numberWithInt:10]]

对于一个数字,你可以使用它

 #define MAX_HEIGHT 12.5 

被接受的答案有两个弱点。 首先,正如其他人指出的那样,使用#define更难以debugging,而不是使用extern NSString* const kBaseUrl结构。 其次,它为常量定义一个文件。 国际海事组织,这是错误的,因为大多数类不需要访问这些常量或访问所有这些加上文件可以变得臃肿,如果所有的常量在那里声明。 一个更好的解决scheme是模块化3个不同层的常量:

  1. 系统层: SystemConstants.hAppConstants.h ,它描述了全局范围内的常量,可以被系统中的任何类访问。 在这里只声明那些必须从不相关的不同类中访问的常量。

  2. 模块/子系统层: ModuleNameConstants.h ,描述了一组常量,这些常量在模块/子系统内是一组相关类的典型值。

  3. 类层:常量驻留在类中,仅供它使用。

只有1,2个与这个问题有关。

我会使用plist初始化的configuration对象 。 为什么打扰其他类与不相干的外部东西?

eppz!settigns我创build了eppz!settigns 。 看到文章先进而简单的方法来保存到NSUserDefaults从一个plist默认值。

在这里输入图像描述