當我們在項目中有很多地方使用到某一個字符串或者是一個int類型整數時 你的第一反應是否是 新建一個pch文件 然后在pch中定義一個全局的常量呢?或者是采用宏定義呢?毋庸置疑 ,這兩個方法都是可以的,但是如果我們的需求是在整個項目中 只產生一份內存地址 而且能達到全局都能使用 該怎么去做呢?
我就不兜圈子了 下面直接進入正題,如果我們想要定義一個全局的常量 且只產生一份內存地址 其實很簡單 那就是使用 const---extern 這兩個關鍵字的配合使用就可以了
1.新建一個空的文件
屏幕快照 2016-01-20 下午8.05.26.png
2.命名為MyConst.m 之所以命名為.m的后綴是因為.m參與編譯 而.h是不參與編譯的
屏幕快照 2016-01-20 下午8.06.02.png
3.在這個MyConst.m文件中寫你需要使用到的全局常量 例如通知名,這里有一個注意點 必須導入UIKit框架 否則不識別NSString這個類型 這個我想大家都懂的 還有一個原因在后面說
代碼如下:
#import <UIKit/UIKit.h>
//全局的通知 字符串常量 const需要放在*后面 因為我們是直接根據 字符串名字進行更改的
NSString * const YJYYSwitchRootVcNotify = @"YJYYSwitchRootVcNotify";
//所有的全局的常量定義 可以放在MyConst.m文件中
const int AGE = 20;
const double HEIGHT = 1.55;
const double WEIGHT = 100;
NSString * const URL = @"http://192.168.1.100";
4.新建一個MyConst.h的頭文件 這個頭文件的目的是獲取到MyConst.m中定義的常量 然后在pch中導入這個頭文件就可以使用了 如果不采用導入頭文件的方式 而是在pch中一個常量一個常量的定義的話 如果在MyConst.m中多增加了很多個常量 那么 pch文件就需要跟著改變 這是很不符合設計邏輯的
代碼如下:
#import <UIKit/UIKit.h>
//全局的常量 定義是在.m文件中 在.h文件中是使用extern關鍵字 訪問.m中的常量
//UIKIT_EXTERN是蘋果使用的 extern 只是添加了一些編譯器代碼
UIKIT_EXTERN NSString * const YJYYSwitchRootVcNotify;
UIKIT_EXTERN const int AGE ;
UIKIT_EXTERN const double HEIGHT ;
UIKIT_EXTERN const double WEIGHT ;
UIKIT_EXTERN NSString * const URL ;
細心的朋友應該還記得前面我賣了個關子 那就是為什么要導入UIKit框架 除了上訴的第一點原因 其實最主要的是接下來我要說的第二點 如果你還夠用心看這篇文章 你應該看到了 我在這里采用了UIKIT_EXTERN 而不是采用的 extern 這是為什么呢? 其實我只是查看了一下蘋果的做法 雖然看不到蘋果底層實現 但是我通過查看蘋果定義通知的方法 看到了一點線索
//以下是蘋果定義鍵盤通知的字符串常量 我們可以看到它采用的是UIKIT_EXTERN
UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;
接著往里探究 可以看到UIKIT_EXTERN 其實是一個宏定義 蘋果只是在這里添加了一些編譯器的指令而已 但是具體有些什么用 我也不得而知 但是可以看到里面的關鍵字 __cplusplus 那就是C++ 沒錯 就是C++ 那接下來就給程序員們無限的遐想了 我的理解是 可以設計到一些C++的代碼的話 蘋果會經過一些處理吧 但這個具體是因為啥 看給位看官的想法了
#ifdef __cplusplus
#define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
#endif