#pragma聲明主要由Xcode用來完成兩個(gè)主要任務(wù)——整理代碼和防止編譯器警告。
整理代碼
代碼的整潔程度反映了程序員及其代碼的靠譜程度。缺少慣性和一致性的代碼表明作者要么疏忽要么無能,更遭到的是,使得一個(gè)項(xiàng)目難以維護(hù)和協(xié)作。
好的習(xí)慣從#prama mark開始。就像這樣:
@implementation ViewController
- (id)init {
...
}
#pragma mark - UIViewController
- (void)viewDidLoad {
...
}
#pragma mark - IBAction
- (IBAction)cancel:(id)sender {
...
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
...
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
}
在你的@implementation中使用#pragma mark ,將代碼分割成多個(gè)邏輯塊。這些邏輯區(qū)塊不僅使得閱讀代碼本身容易許多,也為Xcode源導(dǎo)航增加了視覺線索。
一個(gè)好的習(xí)慣是將一個(gè)類里面的所有方法根據(jù)它們的來源組合放在一起。比如,來源UITableViewDelegate的所有方法放在一起并在這些方法前加入#pragma mark - UITableViewDelegate標(biāo)注。
防止警告
#pragma mark同樣可以用來防止來自編譯器或者靜態(tài)分析器的警告,這點(diǎn)用的比較少。
比糟糕格式的代碼更煩人的是生成警告的代碼。尤其是第三方類庫的代碼。可是,絕大多數(shù)時(shí)候沒有辦法避免編譯器警告。在某些罕見的場景中,你絕對肯定一個(gè)編譯器異常或者靜態(tài)分析器異常需要被抑制,那么#prama就派上了用場:
// completionBlock在AFURLConnectionOperation中被手動(dòng)的設(shè)置為nil來打破保留周期。
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
self.completionBlock = ^ {
...
};
#pragma clang diagnostic pop
幸運(yùn)的是,Clang提供了一個(gè)便捷的方法解決了這一切。通過使用#prama clang diagnostic push/pop, 你可以告訴編譯器針對某一特定部分代碼來忽視特定的警告。
你可以在Clang Compiler User's Manual讀到更多關(guān)于#pragma的LLVM用法的知識。
只是不要用這種方法來清掃合法的警告,這會在后續(xù)工作中帶來很大的麻煩。