1> const int age1 = 21;

     age1 = 100; // 编译报错

  2> int const age2 = 22;

  3> const int *age3 = 23;

     int val1 = 101;

    *age3 = val1; // 编译报错

     age3 = &val1; // 编译通过

  4> int const *age4 = 24;

  5> int * const age5 = 25;

     int val2 = 102;

     age5 = &val2; // 编译报错

     *age5 = val2; // 编译通过

解释:  

  1> const放在最前面可以往后移一位,含义不变,int const age1 = 21, const修饰age1,意味着age1不可修改

  2> 同1

  3> 和1一样,往后移一位,含义不变,int const *age3 = 23, const修饰 *age3,

    首先age3是一个指针变量, *age3是取得指针所指向的变量, const修饰*age3, 意味着 *age3是取得指针所指向的变量 不可修改

  4> 同3

  5> age5是指针变量, const修饰指针变量,意味着 这个指针变量 不可修改,而指针变量存的是地址,意思就是不能把 这个指针变量存的地址 改成 其他地址.或者说不能改变指针的指向.

2. 项目中,经常有一些固定的值,可能会被多个地方使用,这个时候可以考虑用const

  比如下面这样:

    NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";

  其实也可以用宏,比如下面这样:

    #define myURL @"http://xxx.xxx.xxx.xxx:8090"

  但是用const比宏效率更高,比如下面这种打印多次,如果用宏,本质上是在编译时做替换,会占用3份内存,如果用const则不会浪费内存,始终是1份内存

    NSLog(@"远程连接的地址是 %@",myURL);

    NSLog(@"远程连接的地址是 %@",myURL);

    NSLog(@"远程连接的地址是 %@",myURL);

3. 使用const必须注意的地方

  如果多个.m文件需要用到myURL,可以在每一个.m文件都像下面这样初始化吗?

    NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";

  肯定不行,编译时,会报重复定义.比如在pch文件中写上面这行代码,就相当于为每一个.m文件都写这行代码

  要解决重复定义的问题,可以参照苹果的做法,比如系统预置的通知

    UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;

    UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification;

    UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;

    UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;  // UIKIT_EXTERN,是经过处理的extern

    

  (PS:其实也可以用static修饰全局变量,表明该全局变量只对当前文件可见,但是不建议这么做,每个.m文件都这么做,比较浪费内存)

  具体解决方法:

      1>自定义类MYConst,继承自NSObject

      2>在MYConst.m文件中

        #import <Foundation/Foundation.h>

        NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";

      3>在MYConst.h文件中

        #import <Foundation/Foundation.h>

        extern NSString * const myURL; // extern,外部的意思,表明这个全局变量,不是自己的,是别人的,请在其他文件里找这个全局变量

      4> 在pch文件中 #import "MYConst.h",这样项目里每一个.m文件都有 extern NSString * const myURL;

     

最新文章

  1. kali安装vmware tools
  2. Vim编辑器的常用快捷键.
  3. BrnShop开源网上商城第四讲:自定义插件
  4. Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
  5. git安装及使用简介
  6. linux下安装部署环境:jdk、tomcat、nginx
  7. Docker存储驱动之AUFS简介
  8. 解决 apache poi 转换 word(docx) 文件到 html 文件表格没边框的问题
  9. Linux - script练习
  10. 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务
  11. 常用git的命令
  12. FCN 项目部分代码学习
  13. MySQL准入规范及容量评估
  14. asp.net乱码问题
  15. 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!
  16. c++中文件读取
  17. 《流畅的python》这本确实老辣
  18. Python基础笔记(二)
  19. python3 bytes 和 string转换
  20. Python3基础 os listdir 列举指定的所有文件及文件夹的名字

热门文章

  1. django路由的反向解析
  2. Referenced file contains errors (xml文件第一行小红叉错误)
  3. Django:Python3.6.2+Django2.0配置MySQL 转载
  4. 【hbase】hbase的shell操作笔记
  5. Flask-SQLAlchemy操作指南
  6. 18,flask项目中使用celery
  7. 191016 Linux中安装python3
  8. 2013.5.21 - KDD第三十三天
  9. spark HMM
  10. Java中使用BufferedReader的readLine()方法和read()方法来读取文件内容