const经典面试题
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;
最新文章
- kali安装vmware tools
- Vim编辑器的常用快捷键.
- BrnShop开源网上商城第四讲:自定义插件
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- git安装及使用简介
- linux下安装部署环境:jdk、tomcat、nginx
- Docker存储驱动之AUFS简介
- 解决 apache poi 转换 word(docx) 文件到 html 文件表格没边框的问题
- Linux - script练习
- 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务
- 常用git的命令
- FCN 项目部分代码学习
- MySQL准入规范及容量评估
- asp.net乱码问题
- 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!
- c++中文件读取
- 《流畅的python》这本确实老辣
- Python基础笔记(二)
- python3 bytes 和 string转换
- Python3基础 os listdir 列举指定的所有文件及文件夹的名字
热门文章
- django路由的反向解析
- Referenced file contains errors (xml文件第一行小红叉错误)
- Django:Python3.6.2+Django2.0配置MySQL 转载
- 【hbase】hbase的shell操作笔记
- Flask-SQLAlchemy操作指南
- 18,flask项目中使用celery
- 191016 Linux中安装python3
- 2013.5.21 - KDD第三十三天
- spark HMM
- Java中使用BufferedReader的readLine()方法和read()方法来读取文件内容