1. 程式人生 > >iOS開發:#pragma程式碼整理與警告處理

iOS開發:#pragma程式碼整理與警告處理

#pragma

其作用是:整理程式碼和防止編譯器警告。
作為預處理指令,#pragma在編譯時進行計算,但它並不像如 #ifdef…#endif 之類的巨集,#pragma 的使用不會改變程式碼的執行軌跡。反過來思考更加通俗易懂:註釋是不會影響專案的執行順序

一、整理程式碼

有一定經驗的iOS開發程式猿,一般會在自己的程式碼中使用【#pragma mark - message】將程式碼分成一個個邏輯區塊,方便自己和同事查詢和閱讀程式碼。如果沒有使用#pragma來整理程式碼沒,也沒有做好程式碼分離,這對程式設計師來說簡直就是一場災難。
下面,我在這裡對#pragma 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來將程式碼分割成一個個邏輯區塊。這些邏輯區塊可以使程式碼更具有可讀性。當你點選功能欄的方法那一區塊的時候就會出現如下的列表。ps:使用 【#pragma mark - 】可以增加一行水平分割線
圖一

二、遮蔽警告處理

對於【#pragma】消除警告處理的用法估計用的人就比較少了。對這一塊比較瞭解的人,一般對程式碼都有一定的強迫症,想盡可能的消除掉警告。下面我對這一塊的使用進行詳細的說明:
相信很多人都會在程式碼裡面匯入一些第三方庫,目前很多的第三方庫都帶有很多編譯器警告。如果你不想看到這些警告或者已經確認沒有問題,但它仍然報警告的時候,這時候Clang提供了一個非常方便的方法來處理這一問題。

[1] 特定程式碼警告處理

通過使用【#pragma clang diagnostic push/pop】,你可以告訴編譯器僅僅為某一特定部分的程式碼(最初的診斷設定在最後的pop被恢復)忽視特定警告。其步驟如下:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-相關命令"
    // 你自己的程式碼
#pragma clang diagnostic pop

下面例舉幾個常見的使用:

1、方法棄用警告
#pragma clang diagnostic push   
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"  
   //  
#pragma clang diagnostic pop
2、 不相容指標型別
    #pragma clang diagnostic push   
    #pragma clang diagnostic ignored "-Wincompatible-pointer-types"   
    //  
    #pragma clang diagnostic pop  
3、迴圈引用
    // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle.  
    #pragma clang diagnostic push  
    #pragma clang diagnostic ignored "-Warc-retain-cycles"  
        self.completionBlock = ^ {  
            ...  
        };  
    #pragma clang diagnostic pop  
4、未使用變數
    // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle.  
    #pragma clang diagnostic push  
    #pragma clang diagnostic ignored "-Warc-retain-cycles"  
        self.completionBlock = ^ {  
            ...  
        };  
    #pragma clang diagnostic pop  
5、未使用default
#pragma clang diagnostic push   
#pragma clang diagnostic ignored "-Wunused-variable"   
  int a;   
#pragma clang diagnostic pop  

在push的時候開啟,在pop的時候結束,其中在ignored開始後忽略報警。

[2] 整個應用警告處理

在專案的building setting裡面搜尋【Other Warning Flags】,我們可以在裡面,新增想要消除的警告。當然在這裡設定,對專案所有檔案都起作用,具體使用步驟如下圖:
圖二

[3] 針對檔案類或整個應用

一般情況下,有一些想要忽略的警告(注意不是致命錯誤!)可以在檔案頂端加入,其程式碼姿勢如下:

#pragma clang diagnostic ignored "-W警告名"

比較常見的如:

//方法棄用
#pragma clang diagnostic ignored "-Wdeprecated-declarations"         
//使用位置變數
#pragma clang diagnostic ignored "-Wunused-variable"   

那麼上面裡例舉的那些警告名怎麼獲取呢,請看下圖:

圖三

圖四
獲取到警告名稱後,直接複製到對應的方法即可。

在這裡我整理了一個【ZMWarmingIgnored.h】檔案類,包含了絕大部分的警告名,放在xxx.pch檔案中呼叫,可以消除大部分的警告,歡迎大家使用:
點我馬上去下載

三、補充:警告的使用

如果我們追求程式碼的嚴苛和謹慎我們可以新增一些我們平常沒有使用的警告。也可以在Other C Flags 中加入【-Wall】(開啟大部分警告),-Wextra,【-Weverything】(開啟全部警告)來新增警告,當然在除錯過程中不推薦,不然你試試就知道了������
這裡面的警告有許多是編譯器開發人員所使用的警告,但是同時也能讓我們的程式碼更加清晰,規範!推薦程式碼release的階段最好開啟其他警告!

最後我們可以在專案中使用

#warning this is a warning

新增一個警告,提醒我們需要注意的地方,甚至我們可以使用

#error This is a error

來新增一個嚴重警告,提醒我們還有一些重要的事沒有做完,比如在編寫第三方庫的時候還需要新增其他庫。
我們手動新增嚴重警告,會比在註釋中新增說明要醒目的很多!

參考連結

相關推薦

iOS開發:#pragma程式碼整理警告處理

#pragma 其作用是:整理程式碼和防止編譯器警告。 作為預處理指令,#pragma在編譯時進行計算,但它並不像如 #ifdef…#endif 之類的巨集,#pragma 的使用不會改變程式碼的執行軌跡。反過來思考更加通俗易懂:註釋是不會影響專案的執行順序

iOS開發#pragma處理指令_Pragma操作符

#pragma 預處理指令 在C/C++標準中,#pragma是一條預處理的指令(preprocessor directive)。簡單地說,#pragma是用來向編譯器傳達語言標準以外的一些資訊。 整理程式碼 舉個簡單的例子,如果我們在程式碼的標頭檔案中定義了以下語句

iOS開發 SDWebImage 獲取快取清除快取

獲取快取:     //獲取快取圖片的大小(位元組)     NSUInteger bytesCache = [[SDImageCache sharedImageCache] getSize];     //換算成 MB (

iOS開發之--巨集定義const的區別及使用方法

巨集定義的常見用法: 定義一段程式碼,或指定字串抽成巨集。 const(常量): 當有字串常量的時候,蘋果推薦我們使用const,蘋果經常把常用的字串定義成const   巨集定義與const的區別: 編譯時刻:巨集是預編譯(編譯之前處理),const是編譯階段。 編

iOS開發 RSA加密解密後臺之間的雙向加密詳解

序言 因為專案中需要用到RSA加密,剛開始也是有點亂,這兩天也整理的差不多了,希望能幫到大家。 這次先上程式碼,我想大部分人肯定是著急解決問題,所以不要廢話太多。 iOS端 後臺是PHP,給我了一段公鑰和他用私鑰加密後的base64編碼,讓我先解一下,看看能否解出(請先不要糾結為什麼給我公鑰解密,公鑰私鑰都

iOS 開發學習資料整理(持續更新)

https://segmentfault.com/a/1190000002473595#articleHeader16 https://github.com/Tim9Liu9/TimLiu-iOS https://github.com/ipader/SwiftGuide 部落格園: http://w

IOS開發通過程式碼方式使用AutoLayout (NSLayoutConstraint + Masonry)

        隨著iPhone6/6+裝置的上市,如何讓手頭上的APP適配多種機型多種螢幕尺寸變得尤為迫切和必要。(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhon

iOS開發】一些常見的警告解決方案(更新中。。。)

Unknown pattern color for the Background Color attribute 1.背景色屬性為未知模式的顏色 解決:預設xib裡面控制元件的背景色為Default。如果出現警告,可能是你定義的顏色Xcode啟動

iOS開發-UIWebView新增頭部尾部控制元件 && 仿iOS 今日頭條新聞詳情頁結構實現

在app開發中我們經常會遇到在內容詳細頁中介面元素比較複雜,或者格式不確定這種情況,通常我們會利用UIWebView來載入html來處理這樣的事件,因為這樣不僅簡單而且可控性更好,我們不會再因為內容格式的改變,再去苦逼的改程式碼,一層層的解析資料,在苦苦的等待稽核,但

iOS開發——ActionSheet的使用彈出選擇對話方塊

     在我們的iOS開發中,常會見到如下介面的需求:。【使用ActionSheet實現】(1)實現程式碼如下:#import "ViewController.h" @interface ViewController ()<UIActionSheetDelegate

iOS開發——純程式碼介面(UIViewController和文字類控制元件)

一、新增檢視控制器(UIViewController) 建立一個ViewController類繼承UIViewController ViewController.m做如下修改 - (void)viewDidLoad { [super viewDid

iOS開發--"Library not found for -"錯誤處理

一般情況下,這種錯誤只會出現在引入存在.a檔案的第三方庫中, 而處理該錯誤的方法就是將.a檔案的相對路徑新增進->Target->BuildSetting->Library Search Path中, 並且新增以$(PROJECT_DIR)/開

iOS開發程式碼片段(Code Snippets)提高開發效率

簡介 在 XCode4 引入了一個新特性,那就是“程式碼片段(Code Snippets)”。對於一些經常用到的程式碼,抽象成模板放到 Code Snippets 中,使用的時候就只需要鍵入快捷鍵就可以了。 檢視程式碼片段,請看下圖: 也可以使用 Control + Option + Com

iOS開發:NSDate時區格式化問題

今天做到DatePicker,一個按鈕彈出選擇的日期時間,預設的NSDate Date的顯示的是格林威治標準時間GMT,在中國肯定不適用,所以要轉換為中國時區+8,然後也接觸到ios中的日期時間格式化。 貼上程式碼: //取DatePicker選擇的日期時間 N

iOS開發使用程式碼建立一個Label控制元件

      在iOS中,一個控制元件不僅可以通過在Main.storyboard中通過拖拽的形式加入到介面中,還可以在swift程式碼中非常隨意的使用程式碼建立控制元件,顯得非常的靈活和方便。下面我們來嘗試一下: (1)顯示文字的控制元件是Label,我們在viewDidL

iOS開發——純程式碼介面(UITabBarController,UINavigationController,UIImageView)

一、建立UITabBarController和UINavigationController(標籤欄控制器和導航控制器) 建立兩個類,FirstViewController和SecondViewController。修改AppDelegate.m中的程式碼。

iOS開發中基礎常用細節問題處理

35. 九宮格 //九宮格方法1: 巢狀for 迴圈     for (int a = 0 ; a <2; a ++) {         for (int b = 0 ; b < 3 ; b++) {             UIButton * btn = [UIButton but

ios開發中類方法例項方法區別 以及self有什麼不同

Objective-C裡面既有例項方法也類方法。類方法(Class Method) 有時被稱為工廠方法(Factory Method)或者方便方法(Convenience method)。工廠方法的稱謂明顯和一般意義上的工廠方法不同,從本質上來說,類方法可以獨立於物件而執行,所以在其他的語言裡面類方法有的

ios 開發中的日期和時間處理(轉)

NSDate儲存的是世界標準時(UTC),輸出時需要根據時區轉換為本地時間 Dates         NSDate類提供了建立date,比較date以及計算兩個date之間間隔的功能。Date物件是不可改變的。         如果你要建立date物件並表示當前日期,你可以alloc一個NSDate物件並

iOS開發:定時器滾動檢視的互動

定時器與滾動檢視的互動 新聞類的APP一般都有輪播圖,最常見的設計就是給輪播圖一個計時器,讓其自己每隔幾秒輪播到下一張。但如果使用者自行拖拽時計時器就應該失去響應,以使用者的手勢方法為第一響應