開發(fā)場(chǎng)景
編寫代碼經(jīng)常需要定義常量倾贰,例如,寫一個(gè)UI動(dòng)畫拦惋,需要定義一個(gè)動(dòng)畫播放時(shí)間匆浙,通常做法
#define ANIMATION_DURATION 5
這行預(yù)處理指令會(huì)把源代碼中的ANIMATION_DURATION替換為5,可以實(shí)現(xiàn)需求厕妖,但是這樣寫不太好首尼,其原因:
- 代碼中并沒(méi)有定義出常量的類型信息,duration表示時(shí)間叹放,但是代碼中饰恕,并沒(méi)有表示出它值得類型
- 預(yù)處理指令會(huì)把碰到的所有ANIMATION_DURATION全部替換為5
解決此問(wèn)題,可以利用編譯器的特性井仰,代碼如下
static const NSTimeInterval kAnimationDuration = 5;
這樣定義的好處
- 清晰的描述了常量的含義埋嵌,常量的類型
- 命名習(xí)慣(若僅在該類.m文件中使用,則字母前加k俱恶,若在該類外也要使用雹嗦,則加類名)
常量位置
- 若不公開某個(gè)常量范舀,則將其定義在該類的.m文件
#import "ViewController.h"
static const NSTimeInterval kAnimationDuration = 5;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self animation];
}
- (void)animation{
[UIView animateWithDuration:kAnimationDuration animations:^{
}];
}
@end
注意:變量一定要同時(shí)用static與const來(lái)聲明。
const修飾符所聲明的變量了罪,如果修改就會(huì)報(bào)錯(cuò)
static修飾符則意味著該變量?jī)H在定義此變量的.m文件可見(jiàn)
- 對(duì)外公開某個(gè)常量(比如通知名稱)
- 此類常量需要放在“全局符號(hào)表”中锭环,這樣別的類可以使用
- 這個(gè)常量在.h中聲明,在.m中定義
- 這個(gè)常量名字泊藕,最好使用與之相關(guān)的類名做前綴
#import <UIKit/UIKit.h>
@interface LoginViewController : UIViewController
extern NSString *const LoginNoti;
@end
#import "LoginViewController.h"
NSString *const LoginNoti = @"login";
@implementation LoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]postNotificationName:LoginNoti object:nil];
}
@end
#import "ViewController.h"
#import "LoginViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(run) name:LoginNoti object:nil];
}
- (void)run{
NSLog(@"run");
}
@end
要點(diǎn)
- 不要用預(yù)處理指令定義常量辅辩,因?yàn)椴缓愋托畔ⅲ矣腥烁牧顺A恐狄膊粫?huì)報(bào)錯(cuò)
- 在實(shí)現(xiàn)文件里使用static娃圆、const來(lái)定義的常量只能在該類的.m文件中使用玫锋,此類常量不在全局符號(hào)中,所以無(wú)需加前綴
- 在頭文件中使用extern來(lái)聲明全局變量讼呢,并在相關(guān)實(shí)現(xiàn)文件中定義其值撩鹿,這種常量要出現(xiàn)在全局符號(hào)表中,其名稱需要加上與之相關(guān)的類名
參考
Effective+Objective-C 2.0 編寫高質(zhì)量iOS與OS X代碼的52個(gè)有效方法