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

时间:2012-02-12 17:14:20

标签: objective-c ios

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

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

http://api.mysite.com/resources.json
http://api.mysite.com/other_resources.json

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

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

任何建议表示赞赏

5 个答案:

答案 0 :(得分: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"

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

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

REVISION

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

使用const变量

Constants.h文件中创建常量
//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;

并在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";

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

关于修订的一些事项:

  • FOUNDATION_EXPORT vs extern。第一个为C和C ++编译不同。它基本上意味着extern,但在C ++中将添加“C”标志。
  • consts vs definesconsts是类型安全且尊重范围的。 defines恰恰相反。

答案 1 :(得分:48)

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

在MyConstants.m文件中,我有:

NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/";
NSString *const kXYSomeOtherURL = @"http://www.google.com/";

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

然后我有一个像这样的MyConstants.h文件:

extern NSString *const kXYMySitBaseURL;
extern NSString *const kXYSomeOtherURL;

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

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

答案 2 :(得分:11)

我只需创建一个名为Globals.h的文件,其内容如下:

#define kBaseURL @"http://api.mysite.com/"

然后使用:

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

NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL];

答案 3 :(得分:4)

我会创建一个单例或使用AppDelegate并将常量放在那里。

答案 4 :(得分:4)

是的,全局标题将是一个理想的解决方案。除非计划将其用于管理数据存储之类的其他事情,否则我不会像单例模式一样。全局变量的单身人士有点矫枉过正。