[Objective-C] 创建常量
#define
宏定义
#define
是一条预编译指令, 编译器在编译阶段前期会将所有使用到宏的地方简单地进行替换.
在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
但#define
可以使用类型定义,比如
#define MY_INT_CONSTANT ((int)123)
const
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
如果在一个指定单一类里声明常量,在.m 文件顶端用 static const 声明
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果常量属于一个类,但又要其他类可以访问,在头文件将其声明为 extern ,在.m文件定义
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们是全局的常量,在头文件声明,并在相应模块里定义。
enum
enum拥有define和const两者的优点,不过enum只能定义整型常量。
如何选择
尽量选择使用const,因为编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。
相反,define占据更多的内存空间,因为它只是文字替换,导致存在过多的拷贝。当然这一点是对于一般类型的常量来说的。对于int型常量,引用const的地方拿到的是内存地址,地址数据和int差不多,所以内存上应该不会有太大区别。
另外,const对编译器和调试器来说更加友好。这一点可以作为一个很重要的参考。
记录比较粗略,只是简单整理一下网友讨论,这里用到的具体的语法还是要自己去研究,比如const *int 和 int *const的区别等。
#define vs const in Objective-C
What is the best way to create constants in Objective-C
[Objective-C] 创建常量的更多相关文章
- Objective C—创建单例
单例模式是在实际项目开发中用到比较多的一种设计模式,设计原理是整个系统只产生一个对象实例,通过一个统一的方法对外提供这个实例给外部使用. 在Java中,构造单例一般将类的构造函数声明为private类 ...
- 创建工程常量 (OC中的宏定义)
1.oc创建宏 文件 2.swift创建 常量文件 在swift中, 并非是预编译代码替换, 而是设置全局常量, 简单宏, 直接let 加常量名即可
- 动态创建 Lambda 表达式
首先我们看一个简单 Lambda 表达式的构成. i => i > 5 在这个表达式中,"i" 被称为 Parameter,"i > 5" 是 ...
- Objective C 快速入门学习三
1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具 ...
- NSString和NSMutableString的创建及其一些常用方法
NSString和NSMutableString都是对象类型,是NSObject的子类.NSString是不可变字符串,NSMutableString是可变字符串 一.NSString的创建 1.创建 ...
- javascript常量
javascript中没有常量的概念,虽然许多现代的变成环境可能为您提供了用以创建常量的const语句.对于的自己的变量,可以采用相同的命名约定,并且将他们以静态属性的方式添加到构造函数中. //构造 ...
- IOS:利用dispatch_once创建单例
在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...
- DirectX11 学习笔记3 - 创建一个立方体 和 轴
该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅 ...
- String字符串创建与存储机制
Java内存可以粗略的区分为堆内存(Heap)和栈内存(Stack),堆中存放的是对象实例,而栈中存放的则是方法调用过程中的局部变量或引用等. 在Java语言中,字符串的生命与初始化有如下两种方式: ...
随机推荐
- 爬虫--反爬--css反爬---大众点评爬虫
大众点评爬虫分析,,大众点评 的爬虫价格利用css的矢量图偏移,进行加密 只要拦截了css 解析以后再写即可 # -*- coding: utf- -*- """ Cre ...
- 惊艳,Dubbo域名已改,也不再局限于Java!
今天作者想去 Dubbo 官网查下相关资料,发现官方域名由 dubbo.io 直接跳转至 dubbo.apache.org 下了,然后突然回想起 Dubbo 已经在 2 月份正式进入了 Apache ...
- javascript编程中this解析
一.为什么要使用this? this 提供了一种更优雅的方式来隐式"传递"一个对象引用,因此可以将 API 设计得更加简洁并且易于复用.随着你的使用模式越来越复杂,显式传递上下文对 ...
- 关于iscroll插件的使用
本次项目有一个需要多信息展示,需要左右滑动的效果,查资料了解到iscroll,就拿来用,如下调用: var myscroll = new IScroll("#wrapper", { ...
- Golang标准库——io-结构
结构 LimitedReader 定义 限制从Reader中读取的字节数. type LimitedReader struct { R Reader // underlying reader N in ...
- MRTG在Windows平台的安装及使用
MRTG (Multi Router Traffic Grapher)是一款监控网络流量负载的免费软件,目前利用MRTG已经开发出了各式各样的统计系统: 1.系统资源负载统计,例如:磁盘空间.CPU负 ...
- C# GDI+编程之剖析startAngle和sweepAngle
以DrawArc为例,它有一种形式如下的构造函数 public void DrawArc(Pen pen, Rectangle rect, float startAngle, float sweepA ...
- MySQL实验准备(一)--环境准备
MySQL实验脚本准备(一) python操纵数据库的实验环境 安装pip 1.下载脚本文件 [root@db01 .vnc]# wget https://bootstrap.pypa.io/get- ...
- S3C2440 DMA 驱动示例
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t * ...
- c# 判断是否是手机访问
public static bool CheckAgent() { bool flag = false; string agent = HttpContext.Current.Request.User ...