OC中extern、static、const和宏定义

基础知识:(参考Henry725的博客)

1、函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过, 但是当函数或变量定义的时候,它就在内存中有了实际的物理空间。
2、如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!
3、对于一个完整的程序,内存中的分布情况:
| 代码区 |
| 全局数据区 |
| 堆区 |
| 栈区 |

1.extern

extern用于变量的声明,告诉编译器:已经存在一个全局变量,但是不在当前的编译单元内,需要连接的时候在其他编译单元中寻找。

2.static

修改变量作用域为当前编译单元,变量生命周期不变;
避免重复定义全局变量
2.2. 修饰局部变量 -
修改变量的生命周期为整个工程周期,变量作用域不变

3.const

const修饰右边的变量,用来限制变量为只读属性。

4.define

在程序的预编译阶段进行替换处理。

5. define与const

区别:
1.define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
2.define不做检查,不会报编译错误,只是替换。const会编译检查,会报编译错误
3.define在展开的时候才分配内存,展开几次分配几次内存。const在定义的时候会分配一次内存到静态区,使用时不重复分配
4.define可以定义一些简单的运算函数

6. static和const的联合使用

声明一个只读的静态变量

7. extern和const的联合使用

在多个文件中经常使用的同一个全局变量。
使用场景:
1、.h文件中声明


Snip20170724_15.png

2、.m文件中赋值


Snip20170724_16.png

3、pch文件中导入头文件即可在整个项目中访问
在swift想实现一样的功能非常简单,只需要新建一个swift文件,定义常量即可。
Snip20170725_21.png

这里直接访问即可,都不用放到.pch文件中,因为默认权限是internal
public : 最大权限,可以在当前framework和其他framwork中访问;
internal : 默认权限,可以在当前framework中随意访问;
private : 私有权限,只能在当前文件中访问;


Snip20170725_22.png
8、用第7条代替define

一般常量的话,都用extern const 来代替define。
因为一旦定义#define的方式,整个工程将被重新编译,这样带来的时间浪费可想而知
当然了很多情况还是代替不了的,一般定义常量的时候是应该使用这种方式来定义,不过也只是常量宏不被推荐,但是类函数宏用的还是很方便的,
const、#define的优缺点
编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

这种情况还可能出现以下错误
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要NSString* 的地方使用了const NSString*

解决办法就是

.h中 extern const NSString* 替换为extern NSString* const
.m中const NSString* 替换为 NSString* const
解释:前者相当于指针本身不可修改,后者表示指针指向的内容不可修改,两者的作用都是使字符串只可读不可写。

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

相关阅读更多精彩内容

  • static 修饰局部变量 让局部变量只初始化一次 局部变量在程序中只有一份内存 并不会改变局部变量的作用域,仅仅...
    大冲哥阅读 5,239评论 0 1
  • 在项目中,我们经常全局用到一些常量,那么这些常量在项目中怎么管理呢?看完这篇文章相信,读者应该不在迷惑了。 文章展...
    7dfa9c18c1d1阅读 4,286评论 5 2
  • ### const,static,extern简介 ### 一、const与宏的区别(面试题): * `const...
    老骚鹅阅读 3,882评论 0 7
  • 如果没有水我们的世界也会死亡,如果没有水花花草草,一树一木都会干死,如果没有水我们也会渴死,小鱼和海洋动物也会死去...
    月亮宝宝_太阳妈妈阅读 1,490评论 0 0
  • 为她,有人写诗,有人写书;为她,有人弹琴,有人唱歌;为她,有人翻山越岭,有人漂洋过海;为她,有人牵肠挂肚,有人愁肠...
    小花一朵朵阅读 3,813评论 0 4

友情链接更多精彩内容