iOS define和const的区别

一、宏与const 的使用:

很多小伙伴在定义一个常量字符串,都会定义成一个宏,最典型的例子就是服务器的地址。在此所有用宏定义常量字符的小伙伴以后就用const来定义吧!为什么呢 ?我们看看:
宏的用法:一般字符串抽成宏,代码抽成宏使用。
const用法:一般常用的字符串定义成const(对于常量字符串苹果推荐我们使用const)。

宏与const区别:
  • 1 编译时刻不同,宏属于预编译 ,const属于编译时刻

  • 2 宏能定义代码,const不能,多个宏对于编译会相对时间较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间。

  • 3 宏不会检查错误,const会检查错误

通过以上对比,我们以后在开发中如果定义一个常量字符串就用const,定义代码就用宏。我们来看看如何使用const,列举实际项目使用方法如下图:

屏幕快照 2017-05-23 下午5.14.53.png

二、在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰

你能区分下面的吗?知道什么时候用吗?

#define HSCoder @"汉斯哈哈哈"
NSString *HSCoder = @"汉斯哈哈哈";
extern NSString *HSCoder;
extern const NSString *HSCoder;

static const NSString *HSCoder = @"汉斯哈哈哈";

const NSString *HSCoder = @"汉斯哈哈哈";
NSString const *HSCoder = @"汉斯哈哈哈";
NSString * const HSCoder = @"汉斯哈哈哈";

当我们想全局共用一些数据时,可以用宏、变量、常量

宏:

#define HSCoder @"汉斯哈哈哈"

变量:

NSString *HSCoder = @"汉斯哈哈哈";

常量:

四种写法:
static const NSString *HSCoder = @"汉斯哈哈哈";
const NSString *HSCoder = @"汉斯哈哈哈";
NSString const *HSCoder = @"汉斯哈哈哈";
NSString * const HSCoder = @"汉斯哈哈哈";

思考:宏与常/变量的选择?

  • 宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
  • 变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查
  • 常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查
    尽量使用const,看苹果api使用常量多点,如下图:
屏幕快照 2017-05-23 下午5.21.47.png

常量区分

  • 1、全局常量:不管你定义在任何文件夹,外部都能访问
const NSString * partVarial = @"汉斯哈哈哈";

例如:
在ViewController定义一个 partVarial 字符串全局常量:

#import "ViewController.h"
const NSString * partVarial = @"哈哈哈哈哈哈";

在AppDelegate中访问:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    ViewController *vc = [[ViewController alloc]init];
    extern NSString *partVarial;
    NSLog(@"++++++%@",partVarial);
    self.window.rootViewController = vc;
    return YES;
}
  • 2、局部常量:用static修饰后,不能提供外界访问
static const NSString * partVarial = @"汉斯哈哈哈";

例如:
在ViewController定义一个 partVarial 字符串局部常量:

#import "ViewController.h"
static const NSString * partVarial = @"哈哈哈哈哈哈";

编译时报错:

屏幕快照 2017-05-23 下午5.28.49.png

const修饰位置不同,代表什么?

1.const NSString * partVarial = @"汉斯哈哈哈";
2.NSString const * partVarial = @"汉斯哈哈哈";
3.NSString * const partVarial = @"汉斯哈哈哈";
1.const NSString * partVarial = @"汉斯哈哈哈";
"*partVarial"不能被修改, "partVarial"能被修改

2.NSString const * partVarial = @"汉斯哈哈哈";
"*partVarial"不能被修改, "partVarial"能被修改

3.NSString * const partVarial = @"汉斯哈哈哈";
"partVarial"不能被修改,"*partVarial"能被修改

注意:1和2其实没什么区别

结论:const右边的总不能被修改

验证:

const int *p;
屏幕快照 2017-05-23 下午5.31.20.png
int const *p;
屏幕快照 2017-05-23 下午5.32.30.png
int * const p;
屏幕快照 2017-05-23 下午5.33.20.png
所以一般我们定义一个常量又不想被修改应该这样:
NSString * const partVarial = @"汉斯哈哈哈";

测试:
在ViewController定义一个常量partVarial:

#import "ViewController.h"
 NSString * const partVarial = @"汉斯哈哈哈";

在AppDelegate修改常量partVarial,看下面报错提示:

屏幕快照 2017-05-23 下午5.37.25.png

转载:http://www.jianshu.com/p/f83335e036b5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • ### const,static,extern简介 ### 一、const与宏的区别(面试题): * `const...
    老骚鹅阅读 651评论 0 7
  • static 修饰局部变量 让局部变量只初始化一次 局部变量在程序中只有一份内存 并不会改变局部变量的作用域,仅仅...
    大冲哥阅读 1,340评论 0 1
  • 一、const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们...
    金约21依代阅读 228评论 0 1
  • 去尼玛的独立,独立都是孤立无援之下被逼出来的结果。 从家里坐了几个小时的车到学校,搬着大行李箱,背着书包,提着...
    珏六iii阅读 166评论 0 0