美文网首页
iOS中的常量

iOS中的常量

作者: makemake | 来源:发表于2019-02-13 16:03 被阅读48次

    编写代码的时候我们经常需要定义常量,而当某一个常量会多次用到的时候最科学的办法是将它提取出来,方便日后的维护和增强代码的可读性。
    也许我们会这么做:

    #define TABLEVIEW_HEIGHT 600
    #define TABLEVIEW_WIDTH 600
    

    这样做的好处是写起来快、方便。我们通常叫#define指令为预处理指令,预处理过程会将项目中所有引入该头文件的TABLEVIEW_HEIGHT替换成600。所以要想更好的处理这个问题,我通常采用下面的方法:

    static const CGFloat kTableviewHeight = 600.0;
    

    采用这种方法比起预处理指令有2个好处。

    1. 更加清楚描述了常量的含义,一看便知常量的类型为CGFloat
    2. 按照命名习惯(naming convention)在编译单元即.m文件内,常量上加字母k,若需要在多个文件可见则通常加上类名为前缀。

    在适当的地方定义常量位置也是一种很不错的代码风格。在头文件里声明#define指令这种做法很可能会导致名称互相冲突,而且会随着项目代码量增多会越来越不好管理。同时,在Object-C种没有“namespace”的概念,所以在头文件内的TABLEVIEW_HEIGHT相当于声明了一个全局变量。所以我们通常采用static const的方法在.m文件中声明常量。在OC中若变量同时用staticconst修饰,编译器会将它所遇到的变量替换成常量值。
    有时候我们还需要公开某个常量,例如NSNotificationCenter的通知name,接收者需要知道这个name。这时候我们通常会定义一个"global symbol table",这个定义方式与 static const方式有所不同:

    //.h文件 MJRefresh源码中喜欢使用 UIKIT_EXTERN 
    extern NSString *const MKDidLoginnotification;
    
    //.m文件
    NSString *const MKDidLoginnotification = @"MKDidLoginnotification";
    

    这里可以这么理解:MKDidLoginnotification是一个常量,这个常量的本质其实是一个指针(即指针常量),指向了一个NSString对象。

    相关文章

      网友评论

          本文标题:iOS中的常量

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