Effective Objective-C 2.0 — 第四條:多用類型常量,少用#define預先處理指令

來源:互聯網
上載者:User

標籤:

第四條:多用類型常量,少用#define預先處理指令                     

使用#define 預先處理的壞處:定義出來的常量沒有類型資訊,編譯器只是會在編譯前據此執行尋找與替換操作。即使有人重新定義了常量值,編譯器也不會產生警告資訊,這將導致應用程式中的常量值不一致。

 

使用例如:static const NSTimeInterval kAnimationDuration = 0.3;

在實現檔案中使用 static const 來定義“只在編譯單元內可見的常量”。由於此類常量不再全域符號表中,所以無須為其名稱加首碼。

若常量局限於某“實現檔案”之內,則在前面加字母 k,如kAnimationDuration ;若常量在類之外可見,則通常以類名為首碼。

 

含義:如果視圖修改 const 所聲明的變數,那麼編譯器就會報錯。

      假如聲明變數時不加 static 則 編譯器會為它建立一個“外部符號”(external symbol),此時若另一個編譯單元中也聲明了同名變數,那麼編譯器就會拋出一條錯誤訊息: duplicate symbol ——kAnimationDuration in :

              EOCAnimatedView.o

              EOCOtherView.o

   同時 聲明為static 和const 則不會建立符號,範圍@define一樣 且定義的常量帶有類型資訊。

     編譯單元:每個類的實現檔案(以 .m 為尾碼名)

 

需要對外公開某個常量,此類常量需放在“全域符號表”(global symbol table)中,以便可以在定義該常量的變異單元之外使用。在標頭檔中使用 extern 來聲明全域常量,並在相關實現檔案中定義其值。 應用與之相關的類名做首碼。

  // In the header file

  extern NSString *const EOCStringConstant;        //在標頭檔中聲明。

                               // EOCStringConstant 就是“一個常量,而這個常量是指標,指向NSString對象”

  // In the implementation file

  NSString *const EOCStringConstant = @"VALUE"     //在實現檔案中 定義

 

extern 關鍵字,意思是告訴編譯器在全域符號表中將會有一個名叫EOCStringConstant的符號。

     也就是說,編譯器無序查看其定義,即允許代碼使用此常量。因為它知道當連結成二進位檔案之後,肯定能找到這個常量。

此 類常量必須定義且只能定義一次。由實現檔案產生目標檔案時編譯器會在“資料區段”(data section)為字串分配空間。連結器會把此目標檔案與其他目標檔案相連結,以產生最終的二進位檔案。凡是用到EOCStringConstant這 個全域符號的地方,連接器都能將其解析。

Effective Objective-C 2.0 — 第四條:多用類型常量,少用#define預先處理指令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.