關於一些變數的使用

weixin_33936401發表於2016-11-29

如何要宣告一個可以被全域性訪問的的字串常量?

UIKIT_EXTERN NSString *const PYSearchPlaceholderText;
#define UIKIT_EXTERN         extern __attribute__((visibility ("default")))


</br>

const 用法解釋

四種寫法:
 1. static const NSString *HSCoder = @"漢斯哈哈哈"; // 指向的指標不能改變,static限制了不能被外部檔案訪問了
 2. const NSString *HSCoder = @"漢斯哈哈哈"; // 指向的記憶體地址的內容不能改變,但是可以改變指向的指標
 3. NSString const *HSCoder = @"漢斯哈哈哈";  // 指向的記憶體地址的內容不能改變,但是可以改變指向的指標
 4. NSString * const HSCoder = @"漢斯哈哈哈"; // // 指向的記憶體地址的內容不能改變(NSString本身就不能改變),指向的指標也不能改變。

注意:

  1. 以上4種情況,在另外一個檔案中使用extern修飾變數,可以直接改變地址記憶體的內容。(不知道該怎麼解決....才能使得在另外的檔案中也不能修改)
  2. 區域性常量:用static修飾後,不能提供外界訪問

參考http://www.jianshu.com/p/f83335e036b5


</br>

static 用法解釋


</br>

extern 用法解釋

在原始檔A裡定義的變數,在其它原始檔裡是看不見的(即不能訪問)。為了在原始檔B裡能呼叫這個函式,應該在B的頭部加上一個外部宣告: extern 變數; 這樣,在原始檔B裡也可以呼叫那個變數了。

注意這裡的用詞區別:在A裡是定義,在B裡是宣告。一個函式只能(也必須)在一個原始檔裡被定義,但是可以在其它多個原始檔裡被宣告。定義引起儲存分配,是真正產生那個實體。而宣告並不引起儲存分配。

打一個粗俗的比方:在原始檔B裡宣告後,好比在B裡開了一扇窗,讓它可以看到A裡的那個變數。

attribute 用法解釋

attribute是GNU C的一種機制,用法為attribute_ ((attribute-list))。當專案需要作為一個庫被外包引用的時候通常在編譯時可以用引數-fvisibility指定所有符號的可見性。在編譯命令中加入 -fvisibility=hidden引數,會將所有預設的public的屬性變為hidden。此時,如果對函式設定attribute((visibility ("default")))引數,使特定的函式仍然按預設的public屬性處理,則-fvisibility=hidden引數不會對該函式起作用。所以,設定了-fvisibility=hidden引數之後,只有設定了attribute((visibility ("default")))的函式才是對外可見的。


</br>

總結:如果需要讓類或方法可以讓庫外被引用,就需要使用以上程式碼確保程式碼的可見性。

相關文章