iOS应用程序中的全局常量存储位置?
iOS应用程序中的大多数型号都查询web服务器。我想要一个配置文件来存储服务器的基本URL。它看起来像这样:iOS应用程序中的全局常量存储位置?,ios,objective-c,cocoa-touch,constants,global,Ios,Objective C,Cocoa Touch,Constants,Global,iOS应用程序中的大多数型号都查询web服务器。我想要一个配置文件来存储服务器的基本URL。它看起来像这样: // production // static NSString* const baseUrl = "http://website.com/" // testing static NSString* const baseUrl = "http://192.168.0.123/" #define kBaseURL @"http://myServer.com" #define k
// production
// static NSString* const baseUrl = "http://website.com/"
// testing
static NSString* const baseUrl = "http://192.168.0.123/"
#define kBaseURL @"http://myServer.com"
#define kFullURL kBaseURL @"/api/request"
通过注释一行或另一行,我可以立即更改模型指向的服务器。我的问题是,在iOS中存储全局常量的最佳实践是什么?在Android编程中,我们有内置的。在任何情况下(相当于a),我们可以通过以下方式检索这些字符串常量:
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
我以前使用的一种方法是创建一个文件
Settings.plist
,并在启动时使用registerDefaults:
将其加载到NSUserDefaults
。然后,您可以通过以下方式访问其内容:
// Assuming you've defined some constant kMySettingKey.
[[NSUserDefaults standardUserDefaults] objectForKey:kMySettingKey];
虽然我没有做过任何Android开发,但听起来好像这与您描述的字符串资源文件类似。唯一的缺点是不能使用预处理器在设置之间进行切换(例如,在DEBUG
模式下)。不过,我想您可以加载另一个文件
好吧,您希望声明与它相关的接口是本地的——应用程序范围的常量文件不是一件好事 同样,最好只声明一个
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++兼容的外部声明外,这是您通常在苹果Obj-C框架中看到的。
如果常量需要仅对一个文件或函数可见,则
*.m
中的静态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
#ifdef_uuobjc__
#进口
#进口
#导入“AppConstants.h”
#恩迪夫
如果遇到任何问题,请首先确保将Precompile Prefix Header选项设置为NO.您还可以像这样连接字符串常量:
// production
// static NSString* const baseUrl = "http://website.com/"
// testing
static NSString* const baseUrl = "http://192.168.0.123/"
#define kBaseURL @"http://myServer.com"
#define kFullURL kBaseURL @"/api/request"
对于一个数字,你可以像这样使用它
#define MAX_HEIGHT 12.5
全局声明很有趣,但对我来说,深刻改变我编写代码方式的是拥有类的全局实例。我花了几天的时间才真正理解如何使用它,所以我很快在这里总结了一下 我使用类的全局实例(每个项目1或2个,如果需要的话),来重新组合核心数据访问或一些交易逻辑 例如,如果您想让一个中心对象处理所有餐厅的桌子,您可以在启动时创建一个对象,就是这样。此对象可以处理数据库访问,如果不需要保存,也可以在内存中处理。它是集中的,您只显示有用的接口 这是一个很好的帮助,面向对象的,并且是一个很好的方法,可以让你所有的东西都在同一个地方 几行代码:
@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]注册表项可移植:[NsNumber]
编号white:10]]
我想使用一个从
plist
初始化的配置对象。
为什么要用无关的外部内容来打扰其他类
我创建soley就是为了这个原因。有关合并plist
中的默认值的文章,请参阅
#定义基本URL@”http://myWebService.appspot.com/xyz/xx“
NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"];
var STATUS_BAR_GREEN : UIColor = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 1) //
我认为另一种方法要简单得多,只需将其包含在需要包含的文件中,而不是所有文件中,如.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"
公认的答案有两个缺点。 首先,正如其他人指出的那样,使用较难调试的
#define
,使用extern NSString*const kBaseUrl
结构。
其次,它为常量定义了一个文件。在我看来,这是错误的,因为大多数类不需要访问这些常量,或者访问所有这些常量,而且如果在其中声明所有常量,文件可能会变得臃肿。更好的解决方案是将3个不同层的常数模块化:
SystemConstants.h
或AppConstants.h
描述全局范围内的常量,系统中的任何类都可以访问这些常量。这里只声明那些必须从不相关的不同类访问的常量ModuleNameConstants.h
,描述模块/子系统内部一组相关类的典型常量集“constants.h”
方法,根据\ifdef VIEW\u constant声明静态变量