iOS 宏(define)与常量(const)使用
2016-03-23 14:58
274 查看
来源:汉斯哈哈哈(@汉斯哈哈哈 )
链接:http://www.jianshu.com/p/f83335e036b5
在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使用常量多点,如下图:
常量区分
全局常量:不管你定义在任何文件夹,外部都能访问
const
NSString *HSCoder
= @"汉斯哈哈哈";
例如:
在ViewController定义一个 HSCoder 字符串全局常量:
在AppDelegate中访问:
局部常量:用static修饰后,不能提供外界访问
static
const
NSString *HSCoder
= @"汉斯哈哈哈";
例如:
在ViewController定义一个 HSCoder 字符串局部常量:
编译时报错:
const修饰位置不同,代表什么?
1.const
NSString *HSCoder
= @"汉斯哈哈哈";
2.NSString
const
*HSCoder
= @"汉斯哈哈哈";
3.NSString
* const
HSCoder
= @"汉斯哈哈哈";
1.const
NSString
*HSCoder
= @"汉斯哈哈哈";
"*HSCoder"不能被修改,
"HSCoder"能被修改
2.NSString
const
*HSCoder
= @"汉斯哈哈哈";
"*HSCoder"不能被修改,
"HSCoder"能被修改
3.NSString
* const
HSCoder
= @"汉斯哈哈哈";
"HSCoder"不能被修改,"*HSCoder"能被修改
注意:1和2其实没什么区别
结论:const右边的总不能被修改
验证:
const
int *p;
int const *p;
int * const p;
所以一般我们定义一个常量又不想被修改应该这样:
NSString *
const
HSCoder =
@"汉斯哈哈哈";
测试:
在ViewController定义一个常量HSCoder:
在AppDelegate修改常量HSCoder,看下面报错提示:
一般项目中,定义全局常量,会写在独立文件里
HSConst.m 定义常量:
HSConst.h 提供外接访问常量:
在AppDelegate中访问:
链接:http://www.jianshu.com/p/f83335e036b5
在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使用常量多点,如下图:
常量区分
全局常量:不管你定义在任何文件夹,外部都能访问
const
NSString *HSCoder
= @"汉斯哈哈哈";
例如:
在ViewController定义一个 HSCoder 字符串全局常量:
在AppDelegate中访问:
局部常量:用static修饰后,不能提供外界访问
static
const
NSString *HSCoder
= @"汉斯哈哈哈";
例如:
在ViewController定义一个 HSCoder 字符串局部常量:
编译时报错:
const修饰位置不同,代表什么?
1.const
NSString *HSCoder
= @"汉斯哈哈哈";
2.NSString
const
*HSCoder
= @"汉斯哈哈哈";
3.NSString
* const
HSCoder
= @"汉斯哈哈哈";
1.const
NSString
*HSCoder
= @"汉斯哈哈哈";
"*HSCoder"不能被修改,
"HSCoder"能被修改
2.NSString
const
*HSCoder
= @"汉斯哈哈哈";
"*HSCoder"不能被修改,
"HSCoder"能被修改
3.NSString
* const
HSCoder
= @"汉斯哈哈哈";
"HSCoder"不能被修改,"*HSCoder"能被修改
注意:1和2其实没什么区别
结论:const右边的总不能被修改
验证:
const
int *p;
int const *p;
int * const p;
所以一般我们定义一个常量又不想被修改应该这样:
NSString *
const
HSCoder =
@"汉斯哈哈哈";
测试:
在ViewController定义一个常量HSCoder:
在AppDelegate修改常量HSCoder,看下面报错提示:
一般项目中,定义全局常量,会写在独立文件里
HSConst.m 定义常量:
HSConst.h 提供外接访问常量:
在AppDelegate中访问:
相关文章推荐
- 探究iOS开发中多线程之间的通信
- iOS开发小技巧
- Target 'Pods' of project 'Pods' was rejected as an implicit dependency for 'libPods.a' because its a
- iOS开发中,单个页面屏幕旋转问题
- 本篇文章,主要收录本人工作时iOS开发中代码写法的一些奇淫技巧,会持续更新中~
- iOS Quartz2D绘制简单图形
- 高斯模糊效果的简单实现
- 关于IOS我要学的d
- iOS 分类(category)、扩展(Extension)
- iOS9横竖屏设置的处理方法和实例讲解
- ios 调试技巧
- iOS视频边下边播–缓存播放数据流
- iOS小demo之获取文字高度
- iOS 去掉导航栏的边界黑线&去掉搜索框的边界黑线和其中文本输入框的阴影 - 解决方案
- iOS中一些概念的理解:delegate,block,notification
- Masonry介绍与使用实践:快速上手Autolayout
- 以带数字的小圆点方式显示在桌面图标上面,通知用户有新的消息--iOS开发
- IOS NSString 字符串的几种截取方式
- iOS 图片压缩
- IOS开发之下拉列表控件开发