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;
const经典面试题的更多相关文章
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强经典面试题152-Runtime
李洪强经典面试题152-Runtime Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...
- 李洪强iOS经典面试题144-数据存储
李洪强iOS经典面试题144-数据存储 数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...
- 李洪强iOS经典面试题138-Block
李洪强iOS经典面试题138-Block Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ ...
- 李洪强iOS经典面试题上
李洪强iOS经典面试题上 1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ / ...
- 【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)
经典10道c/c++语言经典笔试题(含全部所有参考答案) 1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n ...
- 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...
- 2019年19道java经典面试题(附答案)
1.不可变对象 指对象一旦被创建状态不能再改变.任何修改都会创建一个新的对象,如 String.Integer及其它包装类. 2.能否创建一个包含可变对象的不可变对象? 可以.不要共享可变对象的引用就 ...
随机推荐
- Ruby开发小记
基础点 1.log打印 puts "Hello!" 2.拼接字符 value1 = "today" value2 = "#{value1} is Th ...
- 【JSP】layui+jsp,根据后台数据给复选框默认勾选
1.项目中经常使用复选框,当重复加载,就需要从数据库给复选框一个默认的值了. 2.接下来使用的是JSP中迭代的方法,给复选框绑定值.思路和方法不一定好,仅供参考. <input type=&qu ...
- Part_three:Redis持久化存储
redis持久化存储 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. 1.RD ...
- mysql基础知识整理(一)
一.数据库基本操作 登录: 开启数据库服务,在cmd中输入指令 mysql -u用户名 -p密码 3退出: 在cmd中输入exit/quit;启动服务: net start 服务名 停止服务:net ...
- Python——函数&作用域
我们前面学的都是面向过程式的编程(代码从上到下写,并运行),而函数式编程是将繁杂的代码通过整理特性进行规整.像图书馆一样,将小说.教学.外文等书籍进行分类.让编程人员或看代码人员很容易的查看该段代码的 ...
- api markdown 编排模版
#### 简要描述: - 查询城市编码 #### 接口版本: |版本号|制定人|制定日期|修订日期||:---- |:------ |:-------- |------- ||1.0 |XXX|201 ...
- Flask统计代码行数
流程: 1.获取前端的文件 2.判断文件是否zip文件 3.解压压缩包并保存 4.遍历解压后的文件夹 5.判断文件是否py文件,将绝对路径添加到列表 6.循环列表,排除注释和空号,统计行数 from ...
- 不错的DSP和FPGA作者
https://blog.csdn.net/wordwarwordwar/article/details/90233903
- Flink原理(四)——任务及调度
本文是博主阅读官网文档.博客及书籍后自己所思所得,若是存在有误的地方,欢迎留言分享,谢谢! 一.任务调度 Flink是通过task slot的来定义执行资源的,为优化资源的利用率,Flink通过slo ...
- wget下载出现错误 403:Forbidden
在我尝试wget下载一张图片的时候,出现了如下错误: wget "https://k4b8k3x5.ssl.hwcdn.net/content/140516/1622-saaya-irie- ...