強迫癥自述:做一個0警告的項目


前言

歷經(jīng)兩個月,我終于完成了第一個C端項目全民星跑,整個工程總共8萬行代碼(包含注釋行).作為強迫癥的我把這個項目整的一個警告都沒有,有人問我是不是因為我做了什么屏蔽工作,一鍵屏蔽什么的,其實這根本不存在的,其實我在開始架構(gòu)整個工程的時候,就開始注意警告的個數(shù)了,加上大部分的控件三方都是自己寫的,所以只要出現(xiàn)警告也是容易解決的,然后到項目的最后上線的時候,工程已經(jīng)沒有任何警告了.

有人會問,那么工程沒有警告到底有什么好處呢?我知道的只有一個好處,那就是在項目編譯的時候是非常的快,因為編譯警告也是需要時間的.(PS:此處的好處未經(jīng)過證實....)

全民星跑代碼行數(shù)為8萬行


屏蔽警告

因為項目中我很少用到其他的三方,大部分是我自己寫的,有用到的三方比如高德地圖也是最新版本的,所以我很少用到屏蔽警告,但是我在做老項目版本迭代時候用到過屏蔽警告,主要是因為如果我隨意篡改工程的話,可能會影響工程的功能,所以有些問題我只屏蔽了,還有的是一些三方的支持版本過低,或者是版本過時,做版本迭代的這個項目AFNetworking是2.5版的(早不知道過時多長時間了... ) 全部讓我手動改成AFNetworking3.0了,像這種比較常見的三方我還是建議不用屏蔽,直接手動升級到最新版本吧!

下面我就說幾個最常見的警告解決方案.

先說一個#pramark預(yù)指令屏蔽警告方式,具體格式如下所示.

#pragma clang diagnostic push  
#pragma clang diagnostic ignored "-相關(guān)命令"  
    // 你自己的代碼  
#pragma clang diagnostic pop  

忽略方法被棄用的警告(-Wdeprecated-declarations)

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:@"忽略警告" message:@"忽略警告" delegate:self cancelButtonTitle:@"取消" otherButtonTitles: nil];
    #pragma clang diagnostic pop

忽略不兼容指針類型的警告(-Wincompatible-pointer-types)

     #pragma clang diagnostic push
     #pragma clang diagnostic ignored "-Wincompatible-pointer-types"
     //code這里插入相關(guān)的代碼
     #pragma clang diagnostic pop

忽略循環(huán)引用的警告(-Warc-retain-cycles)

     #pragma clang diagnostic push
     #pragma clang diagnostic ignored "-Warc-retain-cycles"
       self.completionBlock = ^ {
            self.skScene = [SKScene sceneWithSize:self.videoNode.size];
        };
     #pragma clang diagnostic pop

忽略定義變量未使用的警告(-Wunused-variable)

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-variable"
    int i = 1;
    #pragma clang diagnostic pop

忽略selector中使用了不存在的方法名的警告(-Wundeclared-selector)

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wundeclared-selector"
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    #pragma clang diagnostic pop



除了上面的警告之外,我們經(jīng)常會遇到一些三方最低支持版本比我們預(yù)設(shè)的項目版本要高很多,就會爆出如下的警告.

Object file(三方靜態(tài)庫中的源文件) was built for newer iOS version(三方版本) than being linked (工程版本)

這個警告屏蔽起來比較簡單,我們只需要在Build Settings ->Other Linker Flags中添加上一個-w字段即可.



還有就是我們會遇到如下警告.這表示是查詢 Library 的時候出現(xiàn)的異常召川。

"directory not found for option '-L/..."

我們只需要在Project -> targets -> Build Setting -> Library Search Paths中找到對應(yīng)的文件名刪除即可.

和上面的警告類似,我們在查詢 Framework 的時候也會出現(xiàn)異常。

"directory not found for option '-F/..."

我們只需要在Project -> targets -> Build Setting -> Framework Search Paths中找到對應(yīng)的文件名刪除即可.

那么,這種問題是如何造成的呢?可能就是因為哦們導(dǎo)入三方庫的時候,由于功能需求,我們不需要這個三方庫,我們移除的時候,在 Library 和 Framework 中并沒有移除對應(yīng)的路徑信息,所以就會爆出這樣的警告來.這樣的警告,我們注意下就可以完全消除了.



前任做的項目中含有友盟SDK(版本:4.2.1),經(jīng)常會爆出這樣的xib警告.

 warning: Unsupported Configuration: This file is set to build for a version older than the deployment target. Functionality may be limited. 

我們通過錯誤警告信息找到對應(yīng)的Xib文件,然后修改** Build for**屬性.



我們有時候在Debug模式下沒有警告但是在Release模式下出現(xiàn)了如下的警告.

warning:xxxx:No such file or directory

解決方案也是很簡單.我們只需要在Project -> targets -> Build Setting -> Debug Information Format把它的值改成DWARF即可.如下圖所示.



警告類型

performSelector may cause a leak because its selector is unknown

除了上圖的一些警告,我們自己給一個類寫Tager-Action的時候,會出現(xiàn)如下警告.

#import <UIKit/UIKit.h>

@interface TapView : UIView
//目標(biāo)
@property(weak,nonatomic)id target;
//行為
@property(assign,nonatomic)SEL action;

//自定義方法
-(void)addCustomtarget:(id)target andAction:(SEL)action;

@end

#import "TapView.h"

@implementation TapView

//自定義方法
-(void)addCustomtarget:(id)target andAction:(SEL)action{
    
    _action = action;
    _target = target;
    
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //當(dāng)視圖點擊的時候,target去執(zhí)行action的方法并把自己傳過去.
    //首先代理不能是空,而且代理(代理是對象!)的類中有方法并且能傳出過來.
    if (nil != _target && [[_target class] instancesRespondToSelector:_action]) {
        [_target performSelector:_action withObject:self];
        
    }
    
}
@end

那么為什么在ARC環(huán)境下會造成這種情況呢?這是因為使用 [someController performSelector: NSSelectorFromString(@"someMethod")]; 時ARC并不知道該方法的返回值是什么,不知道該如何處理.所以就會爆這樣的錯誤,那么我們該如何解決呢?我們可以使用上面的預(yù)處理指令來屏蔽,不過最好的方法還是從根本上解決這個問題,我們可以使用函數(shù)指針的形勢來處理這個警告.如下所示.

        if (nil != _target && [_target respondsToSelector:_action]) {
            
            NSString *actionName = NSStringFromSelector(_action);
            SEL selector = NSSelectorFromString(actionName);
            
            IMP imp = [_target methodForSelector:selector];
            
            void (*func)(id, SEL) = (void *)imp;
            
            func(_target, selector);
            
        }



警告類型

Pointer is missing a nullability type specifier.....

在iOS8.3的寫過一個輪播圖的三方,這個三方是沒有任何警告的,但是在這次使用的時候卻在初始化的時候,報了一個警告.如圖所示.

其實就是編譯器不知道我們這個是不是可為空的,第一個方法那就是我們一個個的修改,比較的繁瑣.解決完成之后如下圖所示.

第二種就是蘋果官方給我們提供的預(yù)處理指令,我們只需要把不可為空的屬性寫在其中即可.

NS_ASSUME_NONNULL_BEGIN
//不可為空的屬性
NS_ASSUME_NONNULL_END

示例如下如下所示.


總結(jié)

這邊文章到這里就結(jié)束了,但是我的分享之路還沒有結(jié)束,接下來,我會把全民星跑項目中的技術(shù)點來進行分析共享,也希望大家多多支持我做的騷應(yīng)用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市译蒂,隨后出現(xiàn)的幾起案子愕难,更是在濱河造成了極大的恐慌偎快,老刑警劉巖顷链,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橄抹,死亡現(xiàn)場離奇詭異蜜笤,居然都是意外死亡濒蒋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪伙,“玉大人,你說我怎么就攤上這事县好∥穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長翁授。 經(jīng)常有香客問我,道長晾咪,這世上最難降的妖魔是什么收擦? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谍倦,結(jié)果婚禮上塞赂,老公的妹妹穿的比我還像新娘。我一直安慰自己昼蛀,他們只是感情好宴猾,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叼旋,像睡著了一般仇哆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夫植,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天讹剔,我揣著相機與錄音,去河邊找鬼。 笑死辟拷,一個胖子當(dāng)著我的面吹牛撞羽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫冻,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诀紊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隅俘?” 一聲冷哼從身側(cè)響起邻奠,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎为居,沒想到半個月后碌宴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蒙畴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年贰镣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳凝。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碑隆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬音,到底是詐尸還是另有隱情上煤,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布著淆,位于F島的核電站劫狠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏永部。R本人自食惡果不足惜独泞,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扬舒。 院中可真熱鬧阐肤,春花似錦、人聲如沸讲坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晨炕。三九已至,卻和暖如春毫炉,著一層夾襖步出監(jiān)牢的瞬間瓮栗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留费奸,地道東北人弥激。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像愿阐,于是被迫代替她去往敵國和親微服。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 因為要結(jié)局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細(xì)...
    uniapp閱讀 4,414評論 0 12
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同缨历?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中以蕴,被多次使用就有多份冗...
    190CM閱讀 4,204評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)辛孵,斷路器丛肮,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 這個世界很繁華, 小鎮(zhèn)沒有樹魄缚, 鳥兒沒有家宝与。
    美人驢兒閱讀 206評論 3 3