美文网首页OC技术
static、define、const和extern的区别和使用

static、define、const和extern的区别和使用

作者: 刀客传奇 | 来源:发表于2017-09-08 17:22 被阅读41次

    版本记录

    版本号 时间
    V1.0 2017.09.08

    前言

    无论是在C还是OC中,staticdefineconstextern这几个词有时候会用到,尽管频次不高,使用的情况虽然不多,但是基本上也不会出错,下面我们就详细的说一下它们的用法、区别以及使用场景等。

    static

    它是静态变量,从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时又力求不破坏类的封装性,既要求此成员隐藏在类的内部,又要求对外不可见的时候,就可以使用static。

    静态变量的优点:

    • 节省内存。静态变量只存储一处,但供所有对象使用。
    • 它的值是可以更新的。
    • 可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。

    下面我们看一下示例。

    #import "JJKeyWordsVC.h"
    
    @interface JJKeyWordsVC ()
    
    @end
    
    @implementation JJKeyWordsVC
    
    static NSInteger number = 10;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        NSLog(@"number1 = %ld", number);
        
        number ++;
        
        NSLog(@"number2 = %ld", number);
    }
    
    @end
    

    下面看输出结果

    2017-09-08 16:20:02.447 JJOC[1849:46368] number1 = 10
    2017-09-08 16:20:02.447 JJOC[1849:46368] number2 = 11
    

    大家可以看到,静态变量可以修改值,同时修改后的值在整个文件中都可以使用。


    extern

    它是一个外部变量,一般用于引用其他类的全局变量。

    下面我们看一下简单的例子。

    1. JJKeyWordsVC.h
    
    #import <UIKit/UIKit.h>
    
    @interface JJKeyWordsVC : UIViewController
    
    @end
    
    2. JJKeyWordsVC.m
    
    #import "JJKeyWordsVC.h"
    #import "JJExternVC.h"
    
    @interface JJKeyWordsVC ()
    
    @end
    
    @implementation JJKeyWordsVC
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        NSLog(@"%@", AFNetworkingReachabilityDidChangeNotification);
    }
    
    @end
    
    3. JJExternVC.h
    
    #import <UIKit/UIKit.h>
    
    extern NSString *const AFNetworkingReachabilityDidChangeNotification;
    
    @interface JJExternVC : UIViewController
    
    @end
    
    4. JJExternVC.m
    
    #import "JJExternVC.h"
    
    NSString *const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change";
    
    @interface JJExternVC ()
    
    
    @end
    
    @implementation JJExternVC
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    @end
    

    下面看输出结果

    2017-09-08 16:33:59.470 JJOC[2227:61234] com.alamofire.networking.reachability.change
    

    const

    这个在英语里就是常数的意思,相信大家也猜得差不多了。

    用它进行修饰的量只用一份内存,适用于只有一个变量且不允许修改的情况,下面我们就看一下示例代码。

    #import "JJConstVC.h"
    
    @interface JJConstVC ()
    
    @end
    
    const NSInteger number = 100;
    
    @implementation JJConstVC
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        number ++;
        NSLog(@"number = %ld", number);
    }
    
    @end
    

    这种情况是错误的,连编译都过不去,会提示Cannot assign to variable 'number' with const-qualified type 'const NSInteger'(aka 'const long')

    上面的意思就是我定义了NSInteger类型的常量,不能更改其值。


    define

    预处理指令,在编译之前替换宏值,运行中有几个宏就开辟几个临时内存空间, 适用于传入多个变量。

    在宏定义时就是机械的替换,不会做任何语法检查,所以如果替换后是一个表达式的话,最好加一个括号。

    下面我们看一下示例。

    #import "JJdefineVC.h"
    
    #define JJColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
    #define JJValue (200 + 15)
    
    @interface JJdefineVC ()
    
    @end
    
    @implementation JJdefineVC
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.view.backgroundColor = JJColor(180, 100, 100);
        
        NSInteger value = JJValue * 10;
        
        NSLog(@"value = %ld", value);
        
    #ifdef DEBUG
        NSLog(@"DEBUG");
    #else
        NSLog(@"Release");
    #endif
    
    }
    
    @end
    

    下面看输出结果和页面颜色效果图。

    2017-09-08 17:13:19.955 JJOC[3368:86549] value = 2150
    2017-09-08 17:13:19.955 JJOC[3368:86549] DEBUG
    

    上面我定义了不带参数的预处理命令以及带参数的预处理命令,并给出了结果,希望对大家有所帮助吧。

    参考文章

    1. iOS 中extern、static修饰变量的使用及define和const区别

    后记

    未完,待续~~~

    相关文章

      网友评论

        本文标题:static、define、const和extern的区别和使用

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