美文网首页
字符串常量

字符串常量

作者: wpf_register | 来源:发表于2018-11-26 09:00 被阅读15次

参考文档
1. 为什么少用 #define?

#define avatar @"60"
if (false) {
#define avatar @"80"
}
NSLog(avatar); //结果是80

如上代码中,avatar 定义为60,然后在一个永不执行的if代码中定义为80。
但编译时期,编译器会编译这段代码,而这个时候编译器会将 avatar 替换成80。

2. 用 const 来定义常量
const修饰符定义的变量是不可变的,比如定义一个动画时间的常量:

static const NSTImeInterval kAnimateDuration = 0.3;

当你试图去修改“ kAnimateDuration”的值的时候,编译器会报错。
更加重要的是用这种方法定义的常量是带有类型信息的,
而这点则是define不具备的。

注意:

这两种写法是没有差别的
static NSString const * kUserName = @"StrongX";
static const NSString * kUserName = @"StrongX";

const 修饰右边的部分

static NSString const * kUserName = static NSString const (* kUserName )
static NSString * const kUserName = static NSString * const (kUserName)

当const 修饰 userName 时,不可变的是 userName;
而*表示指针指向符,即这时候 userName 指向的内存块地址不可变,而内存保存的内容是可变的。

NSLog(@"内存地址: %x",& kUserName);
kUserName = @"superXLX";
NSLog(@"内存地址: %x",& kUserName);
//内存地址不变,但内容改变

修饰不可变的常量时,需要将 const 修饰放到星号指针指向符后边

3. 一定要同时使用static和const来定义你的变量
const是用来定义一个常量,static在C语言中(OC中延用)则表明此变量只在改变量的输出文件中可用(.m文件)。

如果你不加“static”符号,那么编译器就会对该变量创建一个“外部符号”。如果在不同编译文件中加入以下代码:

NSString * const kUserName = @"StrongX";

可能虽然文件之间并没有相互引用,不存在属性名重复的问题(因为这并不是一个属性,这是一个外部符号),但是编译器还是报错。

他会告诉你在两个目标文件(.0文件是.m文件编译后的输出文件)有一个重复的符号。(OC中没有类似C++中的名字空间的概念)

所以当你在你自己的.m文件中需要声明一个只有你自己可见的局部变量(k开头)的变量的时候一定要同时使用“static”和“const”两个符号

4. 工程中的全局变量

在我们的工程中一定会定义很多全局常量,一般在某个文件中用#define声明许多常量,然后将这个头文件引入“pch”文件中。
不能说这么做不对,但是如同上面说的那样define可能被修改,当然在命名规范的情况下这种情况很少出现,并且这样做的效率很高。

但苹果更推荐另外一种做法:”extern”,这样做的优势是保持常量绝对不会被修改,并且一定初始化还带有类型信息。

在“constants.h”文件中,声明常量

extern NSString *const XUserName;

然后在“constants.m”中定义常量

NSString *const XUserName = @"StrongX";

用“extern”定义的常量必须也只能初始化一次,不满足必须以及只能一次的条件那么编译器就会提醒你。在定义全局变量的时候需要要注意你的命名,你可以使用规定好的前缀来命名。

5. 汇总示例

  • 项目中如果需要私有的常量,正常在.m文件中声明
    而不建议用 #define
/// 显示远程推送内容
static NSString * const ShowRemoteNotificationContentKey = @"ShowRemoteNotificationContentKey";

/// 刷新裸车毛利数据
static NSString * const RefreshDealerGrossProfitNotificationKey = @"RefreshDealerGrossProfitNotificationKey";

/// 需要重新登录
static NSString * const ReLoginNotificationKey = @"ReLoginNotificationKey";

/// 刷新竞品价格数据
static NSString * const RefreshCompetitivePricesNotificationKey = @"RefreshCompetitivePricesNotificationKey";
  • 正常公开的字符串常量定义方式是使用extern关键字
    在.h 文件中定义
/// 用户Token Key
extern NSString * const QXUserTokenKey;

/// 用户UUID
extern NSString * const QXUserUUIDKey;

/// 用户所在的城市
extern NSString * const QXUserCityKey;

/// 第一次启动应用
extern NSString * const QXFirstLaunchKey;

在.m 文件中

/// 用户Token Key
NSString * const QXUserTokenKey = @"com.qianxx.user.token";

/// 用户UUID
NSString * const QXUserUUIDKey = @"com.qianxx.user.uuid";

/// 用户所在的城市
NSString * const QXUserCityKey = @"com.qianxx.user.city";

/// 第一次启动应用
NSString * const QXFirstLaunchKey = @"com.qianxx.user.isFirstLaunch";

相关文章

  • Java中的常量池

    Java中的常量池分为三类:字符串常量池、class常量池、运行时常量池 字符串常量池 从1.7及其之后,字符串常...

  • String内存分析

    1、了解常量池 字符串常量池中存储的就是各种字符串,在常量池中这些字符串都是唯一的。字符串常量池中存储的是在编译期...

  • 字符串常量池

    静态常量池,运行期常量池,字符串常量池 静态常量池 运行时常量池 字符串常量池 问题 结果: 验证new Stri...

  • Java-变量

    常量 常量:在程序运行期间,固定不变的量。常量的分类:字符串常量:凡是用双引号引起来的部分,叫做字符串常量。例如:...

  • Java(常量的使用与概述)

    常量分类:a>字面值常量 b>自定义常量 A>字面值常量·字符串常量·整数 常量·小数常量·字符常量·布尔常量 ...

  • C primer Plus study note chapter

    字符串是由空字符结尾的char类型数组字符串常量:双引号括起来的内容称为字符串常量。字符串常量属于静态存储类别,就...

  • iOS开发之C语言实用概述

    一、常量和变量:常量的定义:const int a = 10; 常量:整型常量实型常量字符型常量字符串常量 变量:...

  • String:字符串常量池

    一、设计思想   为字符串开辟一个字符串常量池,创建字符串常量时,首先检测字符串常量池是否存在该字符串。如存在该字...

  • 【JVM】JVM存放字符串的位置

    字符串存放的位置有两个:字符串常量池和堆内存。 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中; 使...

  • String的最大长度

    create at 20211016,modify at 常量池中的字符串 这样定义的字符串会存入常量池,字符串最...

网友评论

      本文标题:字符串常量

      本文链接:https://www.haomeiwen.com/subject/kjsvqqtx.html