了解一个关键字或一个知识点,我一般习惯于从两个问题着手:1.如何使用?2.有什么用?下面,我们就以解决这两个问题来谈谈标题中的几个关键字。
宏:
// 如何使用?
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height
// 有什么用?
可以用四个字来总结宏的作用:文本替换。凡是在使用宏的地方,你可以理解为把定义为宏的文本复制到该地方。这样不仅可以起到全局使用的作用,而且对于一些复杂、较长的代码用简短的字母进行代替。单例的那个宏是最好的例子。
const:
如何使用?
放在变量之前,用来修饰变量就行,写法较随意。
有什么用?
1.修饰右边基本变量或者指针变量 int a int *p
2.被const修饰变量只读
开发场景:
1.修饰全局变量 => 全局只读变量 => 代替宏
#import "ViewController.h"
NSString * const str = @"全局变量";
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",str);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
2.修饰方法中参数
经典的面试题
// 面试题
int * const p; // p:只读 *p:变量
int const * p1; // p1:变量 *p1:只读
const int * p2; // p2:变量 *p2:只读
const int * const p3; // p3:只读 *p3:只读
int const * const p4; // p4:只读 *p4:只读
宏与const的区别:
// 开发过程中,我们常常把常用的字符串,常用的基本变量 定义成宏,方便我们使用。而const,我们则用来修饰一些不能随意改动的字符串,比如:把网络请求的地址字符串用const进行修饰。在swift中,苹果已经不再使用宏了。
const与宏的区别(
1.编译时刻 宏:预编译 const:编译
2.编译检查 宏没有编译检查,意思就是被宏替代的文本存在问题,编译器也不会发现。const有编译检查
3.宏的好处 定义函数.方法, const不可以
4.宏的坏处 大量使用宏,会导致预编译时间过长
extern:
作用:用来声明一个全局变量,注意是声明!
eg:
在ViewController.m中,我们定义两个全局变量,
然后再代理中使用:
直接打印,不但没有提示,而且还会报错。
下面:我打开注释,并运行:
运行成功,结果打印正常。
总结:extern的作用就是起到一个定义外部全局变量的作用,方便我们在其他文件中使用外部的全局变量。
static与extern
static: 1.修饰局部变量,被static修饰局部变量,延长生命周期,跟整个应用程序有关
* 被static修饰局部变量,只会分配一次内存
* 被static修饰局部变量什么分配内存? 程序一运行就会给static修饰变量分配内存
2.修饰全局变量,被static修饰全局变量,作用域会修改,只能在当前文件下使用
extern:声明外部全局变量,注意:extern只能用于声明,不能用于定义
extern工作原理:先会去当前文件下查找有没有对应全局变量,如果没有,才回去其他文件查找
工作中如何定义全局的变量?为了避免多人开发过程中可能同时定义一个相同变量名的全局变量,我们常常把全局变量写在一个类中。
创建一个继承于NSObject的类。删去
@interface GlobeConst : NSObject
@end
与
@implementation GlobeConst
@end
在.m文件中这样声明:
NSString * const str = @"name";
然后在.h文件中用extern定义
extern NSString * const str;
最后,在使用全局变量的文件中导入该变量的.h文件即可。