天天看點

關于Objective-C的常量

這篇文章是在重拾程式員節操的一個總結,關于常量方法的問題。

其實,之前我們在使用常量的時候,基本沒有太多的考慮,基本上就使用#define string xxx, 而如果需要差別類型的時候,一般都使用 static const int i =0; 之類的,沒有考慮過内鍊、外鍊,通路區域,可變不可變等等的問題,甚至對這些都沒有什麼概念。

附上一些關于Coding 風格的一些材料

Google 開源項目風格指南 (中文版)

Introduction to Coding Guidelines for Cocoa

Constants in Objective-C 

關于Objective-C的常量,我目前了解的常用的主要由這幾個關鍵字的組合 const,extern,static 或者直接使用 #define

1. 關于字元串、整型等基礎類型的常量聲明、定義      

// Constants.h
extern NSString *const MyConstant;
     
// Constants.m
NSString *const MyConstant = @"MyConstant"; 
           

    這樣做的主要優勢是,在字元串常量的比較時,可以直接使用位址的比較,(stringInstance == MyConstant) 代替以前的字元串比較方式,([ stringInstance isEqualToString:myConstant ]),前者執行效率更高效。       這裡需要注意的是,const的聲明方式:

NSString *const constant; //到 NSString 的 const 指針
NSString  const *constant; //到 const  NSString 的指針
const  NSString *constant;  //到 const NSString 的指針
           

     使用第一種方式,是指針不變,即位址不變,字元串的内容可以改變。

    當然也可以使用更快捷的方式:    

// Constants.h     
      #define MyConstant "MyConstant"
           

     關于const 和 define 的主要差別,我也看了很多大牛的文章,主要總結如下

  • const定義常量從彙編的角度來看,隻是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,是以,const定義的常量在程式運作過程中隻有一份拷貝,而#define定義的常量在記憶體中有若幹個拷貝。
  • 編譯器通常不為普通const常量配置設定存儲空間,而是将它們儲存在符号表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀記憶體的操作,使得它的效率也很高。
  • const/define: const常量有資料類型而宏常量沒有資料類型。編譯器可以對前者進行類型安全檢查,而對後者隻是簡單的字元替換,而且宏常量可能會導緻邊際效應。
  • 比通過宏預定義的優點是,可以對常量進行指針比較操作,這是#define做不到的

           還有一點需要注意的是,Objective-C 種const常量是外連接配接的,在标準C中const定義的變量是外連接配接的,即如果一個編譯單元中定義了一個全局const常量,則其在其他編譯單元中是可見的,如果其他編譯單元也定義了同名const常量就會産生重複定義錯誤。這一點與C++不同,C++中const定義的變量是内連接配接的,即每個編譯單元定義的全局const常量是自己獨有的

---------------------------------------------------------------------------------------------------------------------------------------------------------- 未完待續