iOS 中define 与 const 的正确使用

当我们使用全局共用数据的时候,可以使用宏、常亮、变量

宏: #define HSCoder @"hello"
变量:NSString * HSCoder = @"hello";
常亮:static const NSString * HSCoder = @"hello";
const NSString * HSCoder = @"hello";
NSString const * HSCoder = @"hello";
NSString * const HSCoder = @"hello";

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

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

全局常量:不管你定义在任何文件夹,外部都能访问。
局部常量:用static 修饰以后就不能被外部访问。

一般项目中的常量会单独写到一个文件夹中。

常量、又不想被修改:
NSString * const HSCoder = @"hello";

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,427评论 0 6
  • 你能区分下面吗?以及什么情况下使用? #define HSCoder @"你了解我吗“NSString *code...
    代码狂人阅读 711评论 0 0
  • 已经快一周时间,网上下围棋目前还没有赢过一盘棋,这样的挫折也许是有利的,屡败屡战,屡战屡败,越挫越强!
    海滨阅读 134评论 0 1
  • 我爱一切不彻底的事物 雨后的风,冬日的残阳 你浅笑时弯弯的眼角 共同听过的第三乐章 傍晚空无一人的路口 琥珀里凝固...
    南安苏乔阅读 182评论 0 0
  • 应该很长时间了,朋友给了一个项目源码,让我从中学习一下。之前看他的项目的时候感觉逻辑很复杂,也不知道用的什...
    呦释原点阅读 543评论 0 1