美文网首页iOS Kit
【OC】宏、const、static、extern

【OC】宏、const、static、extern

作者: MR_詹 | 来源:发表于2021-01-01 15:34 被阅读0次

    常用字符串,常见基本变量,可以定义为宏
    苹果推荐使用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文件就可以了
    

    相关文章

      网友评论

        本文标题:【OC】宏、const、static、extern

        本文链接:https://www.haomeiwen.com/subject/wlekoktx.html