协慌网

登录 贡献 社区

Objective-C 中的常量

我正在开发一个Cocoa应用程序,并且我使用常量NSString作为存储我的首选项的键名的方法。

我知道这是一个好主意,因为它可以在必要时轻松更改密钥。此外,它是整个 '将您的数据与逻辑分离' 的概念。

无论如何,是否有一种很好的方法可以为整个应用程序定义一次这些常量?我确信这是一种简单而聪明的方式,但是现在我的课程只是重新定义了他们使用的课程。

答案

你应该创建一个像头文件

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

(如果您的代码不会在混合 C / C ++ 环境或其他平台上使用,则可以使用extern而不是FOUNDATION_EXPORT

您可以将此文件包含在使用常量的每个文件中,也可以包含在项目的预编译头中。

您可以在. m 文件中定义这些常量

// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

应将 Constants.m 添加到应用程序 / 框架的目标中,以便将其链接到最终产品。

使用的优点字符串常量代替#define倒是常数是可以测试用于使用指针比较平等( stringInstance == MyFirstConstant )比字符串比较快得多( [stringInstance isEqualToString:MyFirstConstant]和更容易阅读, IMO)。

最简单的方法:

// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"

更好的方法:

// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";

第二个好处的一个好处是更改常量的值不会导致重建整个程序。

还有一件事需要提及。如果需要非全局常量,则应使用static关键字。

// In your *.m file
static NSString * const kNSStringConst = @"const value";

由于static关键字,此 const 在文件外部不可见。


@QuinnTaylor 进行小修正:静态变量在编译单元中可见。通常,这是一个单独的. m 文件(如本例所示),但是如果你在其他地方包含的头文件中声明它,它会咬你,因为你在编译后会遇到链接器错误