美文网首页
(IOS)全局常量

(IOS)全局常量

作者: rightmost | 来源:发表于2018-12-29 17:09 被阅读0次

    一:const---extern :定义一个全局的常量且只产生一份内存地址。

    1:创建两个Empty文件,命名为Const.m 和 Const.h 文件。

    2:引入头文件:#import <UIKit/UIKit.h>。

    3:在 .m 文件中添加需要的常量(字符串、数值):

    need-to-insert-img

    4:在 .h 文件中获取到 .m 中定义的常量

    need-to-insert-img

    5:创建pch文件,导入头文件即可。

    二:关于UIKIT_EXTERN的基本理解

    查看源文件:

        #ifdef __cplusplus

        #define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))

        #else

        #define UIKIT_EXTERN extern __attribute__((visibility ("default")))

        #endif

        #define UIKIT_STATIC_INLINE static inline

    line1: #ifdef __cplusplus, 说的是如果定义了 __cplusplus宏标识符, 则定义后面的内容(line2), 否则定义#else里面的内容(line4)

    line2: #define UIKIT_EXTERN    extern "C"attribute((visibility ("default"))),

    1.extern "C"是为了兼容以前的 C程序, 告诉编译器按照以前C编译方式对(全局)函数或变量进行编译, 否则按照c++方式进行编译[1]。

    eg. C方式编译函数extern void fx(int , int), 不对函数名进行特殊处理编译后函数名为_fx(.obj文件中)

    但是C++方式编译后, (为了支持重载)fx函数变成类似于_fx_int_int这样的函数名, fx(int , float)会编译成_fx_int_float (.obj文件)

    2.attribute是设置函数属性(或者变量属性, 类型属性), 可以设置的属性包括:

    packed,cleanup, common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union等

    visibility属性是设置将本项目的函数作为库使用时的可见性。g++编译时, 加入-fvisibility=hidden参数, 会将所有默认public属性设为hidden, 导致库外文件不可见

    3.但是如果设置了attribute((visibility ("default")))的函数, 其public属性仍能对外可见, 而不是hidden。可见编译指令 -fvisibility是对所有属性符号进行处理, 而attribute((visibility ("default")))是对特定函数可见性进行设置, 避免冲突[3]。

    line3~6:忽略

    line7:#define UIKIT_STATIC_INLINE static inline, 静态内联

    static 关键字修饰函数表示这是一个本地函数, 不能被没有保护该文件(对该文件具有可见性的其他文件)引用、链接,编译阶段就能强制检查

    inline 关键字表示建议编译器将该函数作为一个内联函数,将函数内的代码直接嵌入到每一个引用处,有点类似于宏定义直接替换,但是却包含了编译器严格的类型检查,所以比宏定义安全,却又有同样的执行速度。

    UIKIT_EXTERN简单来说:就是将函数修饰为兼容以往C编译方式的、具有extern属性(文件外可见性)、public修饰的方法或变量库外仍可见的属性

    三:#define :宏定义

    宏定义, 是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换.

    四:他们的不同

    1:const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝

    need-to-insert-img

    const 和 define 的不同

    2:编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高

    既然宏定义能做的事const都能做, 那宏还有什么存在的必要么?

    存在即合理, 既然宏定义还没被淘汰, 那必然有它存在的道理.

    宏能做到const不能办到的事.

    1、宏能定义函数(方法)

    2、OC的单例模式用到宏

    3、宏还能根据传入的参数生成字符串

    相关文章

      网友评论

          本文标题:(IOS)全局常量

          本文链接:https://www.haomeiwen.com/subject/kvjplqtx.html