zoukankan      html  css  js  c++  java
  • [Objective-C] 创建常量

    新博客wossoneri.com

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

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

    #define可以使用类型定义,比如

    #define MY_INT_CONSTANT ((int)123)
    

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

    如果在一个指定单一类里声明常量,在.m 文件顶端用 static const 声明

    static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
    

    如果常量属于一个类,但又要其他类可以访问,在头文件将其声明为 extern ,在.m文件定义

    //.h
    extern NSString *const MyThingNotificationKey;
    
    //.m
    NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
    

    如果它们是全局的常量,在头文件声明,并在相应模块里定义。

    enum
    enum拥有define和const两者的优点,不过enum只能定义整型常量。

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

    相反,define占据更多的内存空间,因为它只是文字替换,导致存在过多的拷贝。当然这一点是对于一般类型的常量来说的。对于int型常量,引用const的地方拿到的是内存地址,地址数据和int差不多,所以内存上应该不会有太大区别。

    另外,const对编译器和调试器来说更加友好。这一点可以作为一个很重要的参考。

    记录比较粗略,只是简单整理一下网友讨论,这里用到的具体的语法还是要自己去研究,比如const *int 和 int *const的区别等。

    #define vs const in Objective-C
    What is the best way to create constants in Objective-C

  • 相关阅读:
    Docker端口映射实现
    Docker容器访问控制
    Docker配置 DNS
    Docker快速配置指南
    Docker外部访问容器
    Docker容器如何互联
    Docker 备份、恢复、迁移数据卷
    19.30内置登录处理
    18.29SSM基础整合开发
    19.30内置登录处理
  • 原文地址:https://www.cnblogs.com/rossoneri/p/5509652.html
Copyright © 2011-2022 走看看