宏
常用字符串,常见基本变量,可以定义为宏
苹果推荐使用cons
t,而不是宏
(Swift没有宏定义)
const 与 宏的区别
1、编译时刻 宏: 预编译 const: 编译
2、编译检查 宏没有编译检查,const有编译检查
3、宏的好处 可以定义函数、方法,const不行
4、宏的坏处 大量使用宏,会导致预编译时间过长
const
作用:
1.修饰右边基本变量或指针变量
2.被const修饰的变量,只读
/// 修饰基本变量
/// 以下两种写法都可以,const 修饰变量a,则a只能读,不能写
int const a = 3;
const int a = 3;
/// 修饰指针变量
int a = 3;
int b = 4;
/// 写法1:const修饰的是p指针变量,所以p指针变量不能改,但是*p是能修改的,*p 是指指针地址指向的内存内容
int * const p = &a
/// 这是正确的
*p = 4
/// 这会报错
p = &b
/// 写法2:const修饰的是指针变量*p,所以*p指针指向的这块内存,
/// 存储的内容是不能修改的,但是指针p是可以修改,修改成指向其他的内存地址
int const *p = &a
/// 这是正确的
p = &b
/// 这是错误的
*p = 6
#面试题
int * const p; /// p: 只读 , *p:变量
inst const *p1; /// p1: 变量 , *p1:只读
const int * p2; /// p2: 变量 , *p2:只读
const int * const p3; /// p3: 只读 , *p3:只读
int const * const p4; /// p4: 只读 , *p4:只读
const的使用
#import "ViewController.h"
/// const 的使用
/// 1. 修饰全局变量 ==> 全局的只读变量
/// 2. 修饰方法中的参数
/// 代替宏的写法
NSString * const name = @"name";
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/// 1. 修饰全局只读变量
[[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:name];
/// 2. 修饰方法中的参数
int a = 10;
[self test:&a];
}
- (void)test:(int const *)a {
/// const 修饰*a,修饰*a指向的地址存储的内容不能修改
}
@end
static的使用
#import "ViewController.h"
/**
static:
1、修饰局部变量,被static修饰局部变量,延长生命周期,跟整个应用程序相同
* 被static修饰的局部变量,只会分配一次内存
* 被static修饰的局部变量什么时候分配内存?程序一运行就会被static修饰变量分配内存
2、修饰全局变量,被static修饰全局变量,作用域会修改,只能在当前文件下使用
*/
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
static int i = 0 ;
i++;
NSLog(@"%d",i);
}
@end
extern
extern使用:
声明外部全局变量
,注意extern只能用于声明
,不能用于定义
extern工作原理
:
先会去当前文件下查找有没有对应的全局变量,如果没有,才会去其他文件查找
/// 第一步:全局变量的定义
/// 在OtherViewController.m 文件中
#import "OtherViewController.h"
NSString *name = @"10";
@interface OtherViewController ()
@end
@implementation OtherViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",name);
}
@end
/// 第二步:使用全局变量
/// 如果其他文件想要使用这个全局变量,那么使用extern声明该全局变量,即可使用
/// 比如:在ViewController使用extern声明此变量
#import "ViewController.h"
extern NSString *name;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",name);
}
@end
const 和 static 联合使用
#import "OtherViewController.h"
/// static 和 const 联合使用
/// const 修饰全局变量
/// static 修饰全局变量,修改作用域(只能在当前文件中使用)
static NSString * const name = @"name";
@interface OtherViewController ()
@end
@implementation OtherViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:name];
}
@end
const 和 extern 联合使用
/// 定义全局的常量,替换宏定义的用法
/// 第一步:创建一个全局定义常量的文件,比如GlobalConst文件
/// GlobalConst.h 文件
#import <Foundation/Foundation.h>
extern NSString * const kNotificationKey;
/// GlobalConst.m 文件
#import "GlobalConst.h"
NSString * const kNotificationKey = @"name";
/// 此后,项目要使用到全局定义的常量,只要导入GlobalConst文件就可以了
网友评论