1. #define 預處理指令定義常量
定義方式如下:
#define ANIMATION_DURATION 0.3
不足之處:
- #define 定義的常量沒有類型信息段多,ANIMATION_DURATION 僅僅是 0.3 的直接替換
- 假設此指令定義在頭文件中酸些,那么所有引入了這個頭文件的代碼取募,其 ANIMATION_DURATION 都會被替換
為了解決上述不足之處琐谤,可以定義為 const 常量
2. const常量
const常量一般分為“類內(nèi)可見”與“類外可見”兩種。
2.1 類內(nèi)可見常量
類內(nèi)可見常量指局限于某個“編譯單元”也就是“實現(xiàn)文件(implementaion file)”之內(nèi)的常量玩敏。
- 命名時一般在前面加小寫字母 k
- 常量的位置定義在實現(xiàn)文件斗忌,而不在頭文件,并且需要加上 static聊品,static修飾意味著該常量僅在 .m 文件可見
- 如果一個變量既聲明為 static 飞蹂,又聲明為 const ,那么編譯器根本不會創(chuàng)建符號翻屈,而是會像 #define 一樣陈哑,把所有遇到的變量都替換為常值。但用這種方式創(chuàng)建的常量帶有類型信息
#import "TestViewController.h"
static const NSTimeInterval kAnimationDuration = 0.3;
@interface TestViewController ()
@end
注意:如果不加static修飾伸眶,默認為 extern 修飾惊窖,如果此時在另一個 .m 文件中也聲明了同名的變量,編譯器會拋出一條錯誤信息:
duplicate symbol _kAnimationDuration in:
TestViewController.o
ViewController.o
2.2 類外可見常量
有時候需要對外公開某個常量厘贼。比方說界酒,NSNotificationName 。此時需要聲明為類外可見的常量嘴秸,此類常量需要放在“全局符號表”中毁欣,以便可以在定義該常量的編譯單元之外使用庇谆。這個常量需要在頭文件中聲明,在實現(xiàn)文件中定義凭疮,定義方式如下:
// In the header file
#import <UIKit/UIKit.h>
// 在頭文件中聲明
extern NSString *const EOCViewClassStringConst;
@interface EOCViewClass : UIView
@end
// In the implementation file
#import "EOCViewClass.h"
// 在實現(xiàn)文件中定義
NSString *const EOCViewClassStringConst = @"value";
@implementation EOCViewClass
@end
- 此類常量必須要定義饭耳,且只能定義一次
- 常量名一般以相關(guān)聯(lián)的類名為前綴
注意事項:
// EOCViewClassStringConst指針為常量
extern NSString *const EOCViewClassStringConst = @"value";
// EOCViewClassStringConst指針所指向的內(nèi)容為常量,此時EOCViewClassStringConst指針的值可更改
// 下面const 與 NSString交換位置后执解,定義仍然相同
extern const NSString *EOCViewClassStringConst = @"value";
extern NSString const *EOCViewClassStringConst = @"value";