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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容