第一章: IOS優化(3) 多用static, const, 少用#define

一: 開發中經常出現的問題
  • 編寫代碼經常要定義常量, 例如, 寫一個UI視圖類, 次視圖需要播放動畫, 這時候, 我們可能會把播放動畫的時間提取為常量, 掌握OC與C語言基礎的人, 也許會用下面這種方法來做:
#define   ANIMATION_DURAION   0.5

上面預處理指令會把源代碼中的ANIMATION_DURAION字符串替換為0.5, 這樣可以實現目的, 但是這樣不是太好, 原因:

  1. 但是代碼中并沒有定義出常量的類型信息, duration這個詞看上去和時間有關, 但是代碼中, 又未明確指出
  2. 預處理指令會把碰到的所有ANIMATION_DURAION一律替換為0.5

要想解決此問題, 可以利用編譯器的某些特性, 代碼如下:

static const NSTimeInterval kAnimationDuration = 0.5;

這樣定義的好處:
1.清晰的描述了常量的含義, 可以知道常量類型為NSTimeInterval, 這有助于為其編寫開發文檔
注意: 這里有一個命名習慣, 如果常量局限于"編譯單元"(stranslation unit, 也就是實現文件之內), 則在字母前加字母k, 如果在類之外, 則通常以類名為前綴

二: 常量 位置以及static , const, extern關鍵字
  1. 如果不公開某個常量, 最好將其放在實現文件里
    #import "ViewController.h"

    static const NSTimeInterval kAnimationDuration;

    @interface ViewController ()

    @end

    @implementation ViewController

    @end

變量一定要同時用static和const來聲明, 如果修改由const修飾符所聲明的變量, 那么編譯器就會報錯, 而static修飾符則意味著該變量僅在定義此變量的編譯單元(也就是實現文件)中可見
但是, 如果不加static, 那么編譯器會為他創建一個"外部符號"(external symbol), 此時若是另一個編譯單元中也聲明了同名變量, 那么編譯單元就會拋出一條錯誤信息


Snip20160318_2.png
* 注意原理:   實際上, 如果聲明一個static, 又聲明了const, 那么編譯器根本不會創建外部符號, 而是會像#define預處理指令一樣, 把所有遇到的變量都替換為常量, 而且還帶有類型信息
  1. 有時候需要對外公開某個常量, 比如說通知, 需要本文件和接收通知的文件都知道這個常量
    此類常量需要放在"全局符號表"(golbal symbol table)中, 以便可以在定義該常量的編譯單元之外使用, 這種常量需要這樣來定義:
        #import <UIKit/UIKit.h>

      @interface ViewController : UIViewController

      extern NSString  const *constant;

      @end

      #import "ViewController.h"

      NSString  const *constant = @"hehe";

      @implementation ViewController

        @end

需要在頭文件中聲明, 在實現文件中定義
extern這個關鍵字告訴編譯器, 在全局符號中將會有一個名叫constant的符號. 也就是說, 編譯器無須查看其定義, 即允許代碼使用此常量, 因為他知道, 當鏈接成二進制文件之后, 肯定能找到這個常量
注意常量的名字, 為避免沖突, 最好是用與之相關的類名做前綴
* 好處:
這樣定義常量要優于使用#define, 因為編譯器會確保長兩只不變,一旦定義好, 就隨處可用. 而使用預處理指令定義的常量可能會被人修改

總結:
  • 不要用預處理指定定義常量, 因為不含類型信息, 而且有人修改了常量值也不會報錯
  • 在實現文件中使用static const來定義"只在編譯單元內可見的常量", 由于此類常量不會在全局符號表中, 所以無需在命名時加前綴
  • 在頭文件中使用extern來聲明全局常量, 并在相關實現文件中定義其值, 這種常量要出現在全局符號表中, 其名稱最好用相關的類名做前綴

聲明: 以上大部分內容均來自 Effective Objective-C

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容