iOS Kit

【OC】宏、const、static、extern

2021-01-01  本文已影响0人  MR_詹

常用字符串,常见基本变量,可以定义为宏
苹果推荐使用const,而不是宏(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文件就可以了
上一篇下一篇

猜你喜欢

热点阅读