哪里是在iOS应用程序中存储常量的最佳位置?

bod*_*ous 37 objective-c ios

我正在开发一个从JSON API获取资源的应用程序.

所有资源都具有相同的基本URL:

http://api.mysite.com/resources.json
http://api.mysite.com/other_resources.json
Run Code Online (Sandbox Code Playgroud)

我想存储http://api.mysite.com/字符串,以便它可供所有控制器和模型使用,在编写资源URL时删除一些重复.

哪里是最好的地方?该-prefix.pch文件?

任何建议表示赞赏

Col*_*gic 65

我同意亚历克斯科普兰的回答,并提出了一个重要的补充.

将所有常量放在名为"Constants.h"的文件中(或者你想要的w/e)

编辑:

  • 三年前,当我回答这个问题时,我还是#define赶时髦,请查看下面的修订版.

Constants.h

#define kFilterDate @"date"
#define kFilterRadius @"radius"
#define kFilterSort @"sort"

//Global Strings
#define kDividingString @" / "

//Strings
#define kTour @"Tour"
#define kToursKey @"tours"
Run Code Online (Sandbox Code Playgroud)

但是,不要在任何需要它的文件中导入它,而是将其导入前缀文件中,以便所有标题在整个项目中自动导入.

Project_Prefix.pch

//
// Prefix header for all source files of the project
//

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "Constants.h"
#endif
Run Code Online (Sandbox Code Playgroud)

修订

尽管以前的所有信息仍然有用,但我们可以采取一些措施来保证我们的常量更加安全.

Constants.h使用const变量在文件中创建常量

//Filters
FOUNDATION_EXPORT NSString *const kFilterDate;
FOUNDATION_EXPORT NSString *const kFilterRadius;
FOUNDATION_EXPORT NSString *const kFilterSort;

//Global Strings
FOUNDATION_EXPORT NSString *const kDividingString;

//Strings
FOUNDATION_EXPORT NSString *const kTour;
FOUNDATION_EXPORT NSString *const kToursKey;
Run Code Online (Sandbox Code Playgroud)

并在 Constants.m

//Filters
NSString *const kFilterDate = @"date";
NSString *const kFilterRadius = @"radius";
NSString *const kFilterSort = @"sort";

//Global Strings
NSString *const kDividingString = @" / ";

//Strings
NSString *const kTour = @"Tour";
NSString *const kToursKey = @"tours";
Run Code Online (Sandbox Code Playgroud)

这仍然可以像上面一样导入到前缀文件中,但只使用文件中真正全局的常量来执行此操作.在许多地方经常使用的那些.将所有常量转储到此文件中将导致使用任何常量的代码耦合到常量文件.因此,如果您尝试重用代码,则常量文件必须随附.这并不总是坏事,并且很多时候都是有意的(这很好),但限制依赖性总是一个好主意.

关于修订的一些事项:

  • FOUNDATION_EXPORTVS extern.第一个为C和C++编译不同.它基本上意味着extern,但在C++中会添加"C"标志.
  • constsVS defines.consts是类型安全和尊重范围.defines恰恰相反.

  • 拥有干净,一致,可读的代码的价值是您痛苦的两倍. (3认同)

UIA*_*dam 48

我个人更喜欢使用实际的const变量而不是定义.

在MyConstants.m文件中,我有:

NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/";
NSString *const kXYSomeOtherURL = @"http://www.google.com/";
Run Code Online (Sandbox Code Playgroud)

其中XY是我的首字母或一些其他"唯一"前缀,以避免与其他常量冲突.

然后我有一个MyConstants.h文件,如下所示:

extern NSString *const kXYMySitBaseURL;
extern NSString *const kXYSomeOtherURL;
Run Code Online (Sandbox Code Playgroud)

根据需要访问这些常量的文件数量,我可以将它包含在预编译的头文件中,就像ColdFusion在他的回答中所建议的那样.

这就是Apple在大多数Core框架中定义其常量的方式.

  • 我知道这可能是一个可以忽略不计的差异 - 但是对于定义一次常量(在应用程序的持续时间内存在)的内存有什么影响?使用使用的宏定义实例/局部变量然后动态GC? (2认同)

Ale*_*lan 11

我只是Globals.h使用以下内容创建一个名为的文件:

#define kBaseURL @"http://api.mysite.com/"
Run Code Online (Sandbox Code Playgroud)

然后使用:

#import "Globals.h" // at the top

NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL];
Run Code Online (Sandbox Code Playgroud)