一 .const 和 宏 的区别
const简介:
之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量。
编译时刻:
宏是预编译(编译之前处理),const是编译阶段。编译检查:
宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。宏的好处:
宏能定义一些函数,方法。 const不能。宏的坏处:
使用大量宏,容易造成编译时间久,每次都需要重新替换。
注意: 有很多博客(Blog)描述宏时,说使用宏会消耗很多内存,这种说法并不正确.它并不会生成很多内存.因为宏定义的是常量,常量都存放在常量区,只会产生一份内存.
// 常见的常量:抽成宏
#define XMGAccount @"account"
#define XMGUserDefault [NSUserDefaults standardUserDefaults]
// 字符串常量
static NSString * const account = @"account";
- (void)viewDidLoad {
[super viewDidLoad];
// 偏好设置存储
// 使用宏
[XMGUserDefault setValue:@"123" forKey:XMGAccount];
// 使用const常量
[[NSUserDefaults standardUserDefaults] setValue:@"123" forKey:account];
}
const作用:限制类型
- 注意点:
- 1.const仅仅只能用来修饰右边的变量(只能修饰变量:基本变量,指针变量,对象变量);
- 2.const修饰的变量表示只读;
- 3.const的书写规范:只能放在变量名的左边;
int *const p = &a; p:只读变量;*p:变量;
const int *p = &a; p:变量;*p:只读变量;
int const *p = &a; p:变量;*p:只读变量;
- int const * const p = &a; p:只读变量;*p:只读变量;
- const int * const p = &a; p:只读变量;*p:只读变量;
const的使用场景:
@implementation ViewController
// 定义只读全局常量
NSString * const str = @"123";
// 当一个方法的参数,只读.
- (void)test:(NSString * const)name
{
}
// 指针只读,不能通过指针修改值
- (void)test1:(int const *)a{
// *a = 10;
}
// 基本数据类型只读
- (void)test2:(int const)a{
}
@end
二 .static 和 extern
static 的作用:
1.修饰局部变量
* 延长这个局部变量的生命周期;
* 局部变量只会分配一次内存;为什么?用static修饰的代码,只会再程序一启动就会执行,以后就不会在执行;
2.修饰全局变量
* 只会修改全局变量的作用域,表示只能再当前文件中使用,工程的中其他文件都不能使用.
extern 的作用:
1.声明一个全局变量,不能定义变量
注意:extern修饰的变量不能初始化;它仅仅用于修饰一个全局变量.
2.使用场景:仅仅用于再其他文件中声明一个全局的变量.
extern工作原理:
如过在某个文件中用extern声明了一个全局变量,那么系统就会先在当前文件查找有没有已经定义的同名全局变量,如果没有找到,才会去其他文件查找。
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;
// static修饰全局变量
static int age = 20;
- (void)test
{
// static修饰局部变量
static int age = 0;
age++;
NSLog(@"%d",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
[self test];
[self test];
extern int age;
NSLog(@"%d",age);
}
三 .static 和 const的联合使用
- 1.全局变量一般都是只读的,不允许其他人修改,所以会加const修饰,而如果还要求不允许在项目的其他文件中使用的话,再在前面加一个static修饰.
- 2.开发中常用static修饰全局变量,只改变作用域 ,为什么要改变全局变量作用域?
答:防止重复声明全局变量。
- 3.开发中声明的全局变量,有些不希望外界改动,只允许读取。比如一个基本数据类型不希望别人改动
- 4.声明一个静态的全局只读常量
static const int a = 20;
- 5.staic和const联合的作用:声明一个静态的全局只读常量
- 6.iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
- 7.开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。 static NSString * const key = @"name";
- 8.如果 const修饰 key1,表示key1只读,key1还是能改变。
static NSString const *key1 = @"name";
四 .extern 和 const的联合使用
- 开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用exterm与const组合
- 原因:
- static与const组合:在每个文件中都需要定义一份静态全局变量;
- extern与const组合:只需要定义一份全局变量,多个文件共享;
- 具体用法: 全局常量正规写法 : 开发中便于管理所有的全局变量,通常搞一个GlobeConst文件,里面专门定义全局变量,统一管理,要不然项目文件多,不好找.
/****************************首页*************************/
extern NSString * const nameKey = @"name";
/****************************首页*************************/ GlobeConst.m
#import
/****************************首页*************************/
NSString * const nameKey = @"name";
/****************************首页*************************/
五 .super / superClass / Class
[self class]; 获取方法调用者的类名
[self superClass]; 获取方法调用者父类的类名
[super class]; 用当前类对象(注意这里super不是父类的类对象,它只是一个)
// class:获取方法调用类名
// superclass:获取方法调用者的父类类名
// super:编译修饰符,不是指针,指向父类标志,
//** 注意:super并不是拿到父类对象去调用父类方法,suoer的本质还是拿到当前对象去调用父类的方法 **//
时间: 2024-10-12 12:14:22