iOS 常用关键字 static、const、 extern、define-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

iOS 常用关键字 static、const、 extern、define

简介: const 常量: 共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查. 全局常量 包括在 .h .m 文件除非 ****@implementation**** 作用域内声明的, 都属于全局常量, 都可能由外部进行访问。

const

常量: 共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查.

  • 全局常量

包括在 .h .m 文件除非 ****@implementation**** 作用域内声明的, 都属于全局常量, 都可能由外部进行访问。

外部文件访问时需要 使用关键字 ****extern**** 并且指明常量声明的类型来使用, 否则编译器默认以 int 类型来处理。应该是与运行时有关。

  • 局部常量

在 .m ****@implementation**** 内 方法实现内进行声明, 只作用于

主要用于修饰 C 或 OC 数据类型, 使声明的变量定义为常量。

三种修饰写法不同作用.

  • const NSString * name = @"Jersey";

使 *name 指针地址不可变, 实际指向内容不受影响, 修改指针地址编译器报错。

  • NSString const * name = @"Jersey";

同上面写法一致.

  • NSString * const name = @"Jersey";

使 *name 指针指向内容不可变, 指针地址不受影响, 修改内容则编译报错。

总结 const 修饰其后面内容。

static

主要用于修饰变量或常量, 使其成为静态变量或常量,延长其生命周期, 可用于修饰局部变量和全局变量。 使用其来修饰的数据类型使其变为静态类型。

  • 静态类型
  1. 在全局变量前加static,全局变量就被定义成为一个全局静态变量(全局变量和静态全局变量的生命周期是一样的,都是在堆中的静态区,在整个工程执行期间内一直存在) 特点如下:

1)存储区:静态存储区没变(静态存储区在整个程序运行期间都存在);

2)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用);

而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

好处:

不会被其他文件所访问,修改;

其他文件中可以使用相同名字的变量,不会发生冲突。

作者:Peak_One

链接:https://www.jianshu.com/p/3fa703e80720

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 修饰局部变量
  1. 延长局部变量的生命周期,程序结束才会销毁。

  2. 局部变量只会生成一份内存,只会初始化一次。

  3. 虽然出了声明的作用域,并且其未销毁,但是并无法进行访问。

  4. 存储区域由 栈 转移到 静态存储区。

  • 修饰全局变量
  1. 改变其作用域,只能在当前文件下访问,其他文件不可见。

  2. 其他文件如果声明同名则不会报错,也不会对此全局变量有影响。

  • 修饰函数

类似修饰变量的作用。

extern

主要有三种用法

  • 使用其来声明供外部使用。(这里为什么还需要特意使用其来添加声明, 必须要引用 .h 才可以使用, 因为在 .h @interface @end 作用域内或者外, 声明都会编译报错, 系统默认其为 全局的, 所以我们必须还要使用 extern 关键字修饰)

  • 使用其来声明引用外部变量等。

一般使用都是搭配 const 来使用.

在 .h 文件 使用 extern 修饰如:

extern const NSString * name;

.m 实现

const NSString * name = @"jersey";

实现必须遵守声明格式。 类型 + 变量名;

extern NSString* const name;

NSString* const name = @"jersey";

extern const NSString* name;

NSString* name = @"jersey"; // 不知道为什么这种格式没报错.

define

  • 简介:

直接借鉴大神:
只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大。

作者:汉斯哈哈哈

链接:https://www.jianshu.com/p/f83335e036b5

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • define 与 const 区别:

宏定义是在预编译期间处理, 在使用时系统直接进行的方法替换, 静态变量等则是在编译期间进行的。

苹果推荐我们在开发中尽量使用常量。

宏定义不会系统不会做编译检查, 所以类型错误也能通过编译, const 则会做编译检查。

能显式的声明数据类型, 并且不会出现自己定义的宏被其他人员更换,导致出现难以排查的 Bug。

不过宏不仅能对数据类型进行定义, 还能对 函数, 结构体, 方法等进行定义 相对比起常量来说作用会更多一些。

在实际开发中, 对于能使用常量定义完成的, 尽量使用常量能实现, 而不要考虑使用 宏。

参考:

iOS 宏(define)与常量(const)的正确使用

【如何正确使用const,static,extern】|那些人追的干货

OC中关键字extern、static、const探究

希望此篇文章对您有所帮助,如有不对的地方,希望大家能留言指出纠正。谢谢!!!!!

学习的路上,与君共勉!!!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章