#pragma聲明主要由Xcode用來完成兩個主要任務(wù)——整理代碼和防止編譯器警告撮奏。
整理代碼
代碼的整潔程度反映了程序員及其代碼的靠譜程度当宴。缺少慣性和一致性的代碼表明作者要么疏忽要么無能,更遭到的是户矢,使得一個項目難以維護(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 ,將代碼分割成多個邏輯塊挂洛。這些邏輯區(qū)塊不僅使得閱讀代碼本身容易許多,也為Xcode源導(dǎo)航增加了視覺線索虏劲。
一個好的習(xí)慣是將一個類里面的所有方法根據(jù)它們的來源組合放在一起。比如柒巫,來源UITableViewDelegate的所有方法放在一起并在這些方法前加入#pragma mark - UITableViewDelegate
標(biāo)注。
防止警告
#pragma mark同樣可以用來防止來自編譯器或者靜態(tài)分析器的警告堡掏,這點用的比較少。
比糟糕格式的代碼更煩人的是生成警告的代碼泉唁。尤其是第三方類庫的代碼⊥ば螅可是,絕大多數(shù)時候沒有辦法避免編譯器警告贱案。在某些罕見的場景中,你絕對肯定一個編譯器異潮ψ伲或者靜態(tài)分析器異常需要被抑制,那么#prama就派上了用場:
// completionBlock在AFURLConnectionOperation中被手動的設(shè)置為nil來打破保留周期瘩燥。
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
self.completionBlock = ^ {
...
};
#pragma clang diagnostic pop
幸運的是,Clang提供了一個便捷的方法解決了這一切厉膀。通過使用#prama clang diagnostic push/pop, 你可以告訴編譯器針對某一特定部分代碼來忽視特定的警告服鹅。
你可以在Clang Compiler User's Manual讀到更多關(guān)于#pragma的LLVM用法的知識凳兵。
只是不要用這種方法來清掃合法的警告企软,這會在后續(xù)工作中帶來很大的麻煩。