【发布时间】:2012-10-11 01:02:40
【问题描述】:
在Objective-C中以下两行有什么区别:
#define myInteger 5
static const NSInteger myInteger = 5;
假设它们在 MyClass.m 中的 implementation 指令之上。
【问题讨论】:
标签: objective-c static constants c-preprocessor
在Objective-C中以下两行有什么区别:
#define myInteger 5
static const NSInteger myInteger = 5;
假设它们在 MyClass.m 中的 implementation 指令之上。
【问题讨论】:
标签: objective-c static constants c-preprocessor
#define myInteger 5
是一个预处理器宏。预处理器将在编译器启动之前将每次出现的myInteger 替换为5。它不是一个变量,它只是一种自动查找和替换机制。
static const NSInteger myInteger = 5;
这是一个“真实”变量,它是常量(声明后无法更改)。静态意味着它将成为对该块的多次调用的共享变量。
【讨论】:
#define myInteger 5 是一个声明常量的宏。
所以无论你在哪里使用myInteger 宏,它都会被预处理器引擎替换为 5。
const NSInteger myInteger = 5; 声明了一个变量 myInteger,它的值是 5。
但是它们的用法是一样的,都是可以用来防止硬编码的常量。
【讨论】:
const 对象只是:一个对象或符号,但它不一定对应于“内存分配” - 可能没有实际分配内存,因为它可能被内联或以其他方式优化。
有区别:
定义为文本替换:
静态常量是内存中的变量
【讨论】:
当使用#define 时,标识符会被编译器替换为指定的值,然后再将代码转换为二进制。这意味着编译器会在您编译应用程序时进行替换。
当您使用 const 并且应用程序运行时,会为常量分配内存,并在运行应用程序时替换值。
【讨论】: