面试题答案
一键面试区别
#define
:- 宏定义是在预处理阶段进行文本替换,不进行类型检查。例如
#define PI 3.14159
,在预处理时,所有出现PI
的地方都会被替换为3.14159
。 - 没有作用域的概念,只要在其定义之后的代码都能使用。如果定义在头文件中,被多个源文件包含,可能会出现重复定义的问题(可通过
#ifndef
等预处理指令避免)。
- 宏定义是在预处理阶段进行文本替换,不进行类型检查。例如
const
:const
定义的常量在编译阶段确定值,有类型检查。例如const CGFloat pi = 3.14159;
,编译器会知道pi
是CGFloat
类型。- 有作用域,默认情况下,在文件内声明的
const
常量作用域仅限于该文件。如果希望在多个文件中共享const
常量,需要在声明和定义时加上extern
关键字。例如在一个.h
文件中声明extern const CGFloat pi;
,在对应的.m
文件中定义const CGFloat pi = 3.14159;
static const
:- 同样在编译阶段确定值,有类型检查。
- 作用域也仅限于定义它的文件,与
const
不同的是,不需要额外使用extern
关键字来控制作用域,即使在头文件中定义static const
常量,每个包含该头文件的源文件都会有一份该常量的副本,不会出现重复定义的链接错误。
适用场景
#define
:- 适用于简单的文本替换,例如定义一些编译开关,如
#define DEBUG_MODE 1
,在代码中通过#ifdef DEBUG_MODE
等预处理指令来控制不同模式下的代码执行。 - 用于定义与平台相关的常量,如
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
,在预处理阶段根据平台信息进行替换。
- 适用于简单的文本替换,例如定义一些编译开关,如
const
:- 适用于定义需要类型检查且可能在多个文件中共享的常量,比如一个应用程序中通用的配置常量,像服务器地址:在
Config.h
中声明extern const NSString *const kServerURL;
,在Config.m
中定义const NSString *const kServerURL = @"http://example.com";
- 适用于定义需要类型检查且可能在多个文件中共享的常量,比如一个应用程序中通用的配置常量,像服务器地址:在
static const
:- 适用于定义仅在当前文件中使用的常量,例如在一个特定的视图控制器文件中,定义一些与该视图控制器相关的固定值,如
static const CGFloat kCellHeight = 44.0;
,这个常量仅在该视图控制器对应的.m
文件中使用,避免了与其他文件中同名常量的冲突。
- 适用于定义仅在当前文件中使用的常量,例如在一个特定的视图控制器文件中,定义一些与该视图控制器相关的固定值,如