博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】iOS 宏(define)与常量(const)的正确使用-- 不错
阅读量:6507 次
发布时间:2019-06-24

本文共 2051 字,大约阅读时间需要 6 分钟。

原文网址:http://www.jianshu.com/p/f83335e036b5

在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰

你能区分下面的吗?知道什么时候用吗?

#define HSCoder @"汉斯哈哈哈"NSString *HSCoder = @"汉斯哈哈哈";extern NSString *HSCoder; extern const NSString *HSCoder; static const NSString *HSCoder = @"汉斯哈哈哈"; const NSString *HSCoder = @"汉斯哈哈哈"; NSString const *HSCoder = @"汉斯哈哈哈"; NSString * const HSCoder = @"汉斯哈哈哈";

当我们想全局共用一些数据时,可以用宏、变量、常量

宏:

#define HSCoder @"汉斯哈哈哈"

变量:

NSString *HSCoder = @"汉斯哈哈哈";

常量:

四种写法:static const NSString *HSCoder = @"汉斯哈哈哈";const NSString *HSCoder = @"汉斯哈哈哈"; NSString const *HSCoder = @"汉斯哈哈哈"; NSString * const HSCoder = @"汉斯哈哈哈";

思考:宏与常/变量的选择?

  • 宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
  • 变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查
  • 常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查

尽量使用const,看苹果api使用常量多点,如下图:

这里写图片描述

常量区分

全局常量:不管你定义在任何文件夹,外部都能访问

const NSString *HSCoder = @"汉斯哈哈哈";

例如:

在ViewController定义一个 HSCoder 字符串全局常量:

这里写图片描述

在AppDelegate中访问:

这里写图片描述

局部常量:用static修饰后,不能提供外界访问

static const NSString *HSCoder = @"汉斯哈哈哈";

例如:

在ViewController定义一个 HSCoder 字符串局部常量:

这里写图片描述

编译时报错:

这里写图片描述

const修饰位置不同,代表什么?

1.const NSString *HSCoder = @"汉斯哈哈哈";2.NSString const *HSCoder = @"汉斯哈哈哈"; 3.NSString * const HSCoder = @"汉斯哈哈哈";
1.const NSString *HSCoder = @"汉斯哈哈哈";"*HSCoder"不能被修改, "HSCoder"能被修改 2.NSString const *HSCoder = @"汉斯哈哈哈"; "*HSCoder"不能被修改, "HSCoder"能被修改 3.NSString * const HSCoder = @"汉斯哈哈哈"; "HSCoder"不能被修改,"*HSCoder"能被修改 注意:1和2其实没什么区别

结论:const右边的总不能被修改

验证:

const int *p;
这里写图片描述
int const *p;
这里写图片描述
int * const p;
这里写图片描述

所以一般我们定义一个常量又不想被修改应该这样:

NSString * const HSCoder = @"汉斯哈哈哈";

测试:

在ViewController定义一个常量HSCoder:

这里写图片描述

在AppDelegate修改常量HSCoder,看下面报错提示:

这里写图片描述

一般项目中,定义全局常量,会写在独立文件里

HSConst.m 定义常量:

这里写图片描述

HSConst.h 提供外接访问常量:

这里写图片描述

在AppDelegate中访问:

这里写图片描述

文/汉斯哈哈哈(简书作者)
原文链接:http://www.jianshu.com/p/f83335e036b5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
你可能感兴趣的文章
JDBC_MySQL_jdbc连接mysql_MySQL
查看>>
mysql cte的好处_Mysql 8 重要新特性 - CTE 通用表表达式
查看>>
zcu106 固化_xilinx zcu106 vcu demo
查看>>
java ftpclient 代码_java后台代码ftpclient下载文件
查看>>
java数据库生成model_继承BaseModelGenerator 生成Model时添加数据库表字段 生成代码示例...
查看>>
macports 安装php,「macports」MacOS 中 MacPorts 安装和使用 - 金橙教程网
查看>>
php 审计 for linux,for linux是什么意思
查看>>
matlab里面连接器是什么,Oops - an error has occurred
查看>>
matlab建立桌面图标,在ubuntu16.04上创建matlab的快捷方式(实现方法)
查看>>
smarty使用php代码,笑谈配置,使用Smarty技术_php
查看>>
oracle数据实际值限制,c# – Oracle数据库TNS密钥“数据源”的值长度超过了’128’的限制...
查看>>
silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
html显示服务器状态,显示服务器时间并一直显示(html代码)
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
背锅侠逆袭之路
查看>>
演示:使用协议分析器取证IPv6的报文结构
查看>>
oracle 11gr2 rac中的4种IP解说
查看>>