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;

     

const经典面试题的更多相关文章

  1. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  2. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  3. 李洪强经典面试题152-Runtime

    李洪强经典面试题152-Runtime   Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...

  4. 李洪强iOS经典面试题144-数据存储

    李洪强iOS经典面试题144-数据存储   数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...

  5. 李洪强iOS经典面试题138-Block

    李洪强iOS经典面试题138-Block   Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ ...

  6. 李洪强iOS经典面试题上

    李洪强iOS经典面试题上     1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ / ...

  7. 【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)

    经典10道c/c++语言经典笔试题(含全部所有参考答案) 1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n ...

  8. 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

    1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...

  9. 2019年19道java经典面试题(附答案)

    1.不可变对象 指对象一旦被创建状态不能再改变.任何修改都会创建一个新的对象,如 String.Integer及其它包装类. 2.能否创建一个包含可变对象的不可变对象? 可以.不要共享可变对象的引用就 ...

随机推荐

  1. java web编程 servlet读取配置文件参数

    新建一个servlet. 然后在web.xml文件里面自动帮助你创建好了<servlet-name><servlet-class><servlet-mapping> ...

  2. 【hbase】hbase-2.2.1配置独立的zookeeper的安装与测试

    下载hbase-2.2.1-bin.tar.gz并执行安装命令: [hadoop@hadoop01 ~]$ tar -zxvf hbase--bin.tar.gz 查看安装目录: [hadoop@ha ...

  3. XPath知识点【一】

    什么是 XPath? XPath 使用路径表达式在 XML 文档中进行导航 XPath 包含一个标准函数库 XPath 是 XSLT 中的主要元素 XPath 是一个 W3C 标准 XPath 路径表 ...

  4. linux系统编程之信号(二)

    经过了漫长的间歇,对于c语言的学习也被中断了很久,现实确实有很多的无耐,计划中的事情总会被打乱,但不管怎样,学习的道路是不能休止的,所以经过了一断温习后现在继续学习C语言,话不多说,进入正题: 信号分 ...

  5. P1801 黑匣子[堆]

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  6. 1216 Vue基础

    目录 前端框架 Vue 1.简介 1.1 优点 2 使用 2.1 基础 2.2 文本指令 2.3 事件指令 2.4 属性指令 JS面向对象补充 前端框架 angular ---更新程度太快,且不向下兼 ...

  7. Centos7 安装谷歌浏览器

    配置下载yum源 cd /etc/yum.repos.d vim google-chrome.repo [google-chrome] name=google-chrome baseurl=http: ...

  8. vue PC端,用到的知识

    1.vue中通过路由跳转的三种方式      https://blog.csdn.net/qq_40072782/article/details/82533477 2.数组解构,对象解构:https: ...

  9. SpringMVC的拦截器和数据校验

    SpringMVC拦截器 什么是拦截器:Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...

  10. (转载) 搭建非域AlwaysOn win2016+SQL2016

    非域搭建Alwayson只是省去搭建域控那一部分,其他大同小异 条件: 操作系统:windows server 2016 数据库:SQL Server 2016 SSMS版本:17.3 节点1:HDD ...