Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS应用程序中的全局常量存储位置?_Ios_Objective C_Cocoa Touch_Constants_Global - Fatal编程技术网

iOS应用程序中的全局常量存储位置?

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

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 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
中的默认值的文章,请参阅

  • 我在YOURPROJECT-Prefix.pch文件中定义了全局常量
  • #定义基本URL@”http://myWebService.appspot.com/xyz/xx“
  • 然后在项目中的任何位置使用BASEURL:

    NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"];
    
  • 更新: 在Xcode 6中,您将找不到在项目中创建的默认.pch文件。因此,请使用在项目中插入.pch文件

    更新: 斯威夫特

  • 创建新的Swift文件[empty without class]比如[AppGlobalMembers]
  • &立即声明/定义成员

    例如:

    var STATUS_BAR_GREEN : UIColor  = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 1)  //
    
  • 如果要在任何类文件(如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"
    

    公认的答案有两个缺点。 首先,正如其他人指出的那样,使用较难调试的
    #define
    ,使用
    extern NSString*const kBaseUrl
    结构。 其次,它为常量定义了一个文件。在我看来,这是错误的,因为大多数类不需要访问这些常量,或者访问所有这些常量,而且如果在其中声明所有常量,文件可能会变得臃肿。更好的解决方案是将3个不同层的常数模块化:

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

  • 模块/子系统层:
    ModuleNameConstants.h
    ,描述模块/子系统内部一组相关类的典型常量集

  • 类层:常量驻留在类中,仅由类使用

  • 只有1,2与该问题相关。

    我使用
    “constants.h”
    方法,根据
    \ifdef VIEW\u constant声明
    静态变量