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.能否创建一个包含可变对象的不可变对象? 可以.不要共享可变对象的引用就 ...
随机推荐
- node+mysql+vue+express项目搭建
第一步:项目搭建之前首先需要安装node环境和MySQL数据库. 在已经完成上述的条件下开始进行以下操作: npm install @vue/cli -g (-g 代表全局安装) 初始化项目 v ...
- Ubuntu-18.04 LTS UEFI 安装U盘制作
要把U盘作为UEFI启动盘,第一个分区要为FAT32分区,EFI程序放在/EFI/Boot/bootx64.efi.为了制作Ubuntu-18.04 LTS安装U盘,可以把一个U盘格式化为FAT32格 ...
- springboot引用三方jar包
在springboot项目中可能会用到三方工具类(比如接入短信网关时给出的工具jar包),这时候需要在springboot项目中手动引入进来 1. springboot工程目录, lib/ucpaas ...
- 布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)
布隆过滤器解决"面试题: 如何建立一个十亿级别的哈希表,限制内存空间" "如何快速查询一个10亿大小的集合中的元素是否存在" 如题 布隆过滤器确实很神奇, 简单 ...
- Druid Spring Boot Starter 从配置到简单运行 -解决zone不匹配 -解决dataSource加载失败
Druid Spring Boot Starter 中文 | English Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池 ...
- P1801 黑匣子[堆]
题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...
- service worker(二)之主页面与service worker通信
实现一个主页面发送消息,worker搜到信息向所有的页面派发消息(当前页面除外) msg.html <!DOCTYPE html> <html lang="en" ...
- LightOJ - 1297 - Largest Box(数学)
链接: https://vjudge.net/problem/LightOJ-1297 题意: In the following figure you can see a rectangular ca ...
- Chrome抓包小技巧
1.抓包时如果有页面跳转,记得把preserve log这个选项勾上
- WinDbg 图形界面功能(一)
当我们启动windbg后,我们就能看到Windbg的样子了,如下: 本部分讨论 WinDbg 图形用户界面的元素. 这些元素包括以下各项:菜单.工具栏和快捷键.菜单有:文件菜单.编辑菜单.视图菜单.调 ...