oc代碼規(guī)范之規(guī)范定義

oc的代碼規(guī)范大抵都是一樣的,重要的是執(zhí)行夜惭。正常review兩三個版本就可以在團隊內(nèi)部形成統(tǒng)一的風格岖食。當然這些規(guī)范也可能隨著成員認知的變化而發(fā)生變化,沒必要教條假丧。

語言規(guī)范

  • [強制]命名規(guī)范

    • [強制]命名約定通 準則:清晰双揪、 一致性。
      1. 清晰:命名應(yīng)該既清晰 簡短包帚,但拒絕為 追求簡短 喪失清晰性渔期,拒絕為 簡潔進 隨意縮寫。
      2. 一致性:命名含義應(yīng)該具有前后渴邦,全局的一致性疯趟,同個功能也應(yīng)該使 同個名稱。
    • [強制]盡量不用縮寫谋梭,除以下已經(jīng)長期使用形成共識的內(nèi)容信峻。
      命名 說明
      alloc allocate
      dealloc dealloc
      info information
      init initialize
      min minimum
      max maximum
      temp temporary
      int integer
      msg message
    • [強制]禁止使用系統(tǒng)前綴開頭,以防止沖突瓮床,原則上兩字母前綴都是系統(tǒng)保留前綴盹舞,盡量使用三個字符最為前綴。
    • [強制]方法名隘庄、參數(shù)名踢步、成員變量、局部變量都采小寫字符開頭丑掺,駝峰命名法获印。
    • [強制]如果方法代表執(zhí)行某個動作,應(yīng)該以動詞開頭街州。
    • [強制]如果方法返回某個屬性兼丰,應(yīng)該直接以屬性作為方法名玻孟,只有當間接返回對象或返回多個對象時,可以使 get鳍征。
    • [建議]同一個類的一系列相關(guān)方法命名應(yīng)該有一致性黍翎,入?yún)⒏嗟姆椒☉?yīng)該在入?yún)⒏俚姆椒竺嬖黾有玛P(guān)鍵字。
    如:
      - (instancetype)initWithURL:(NSURL *)URL;
      - (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy
    
    • [建議]動詞前可以根據(jù)具體情況增加 can, should, will等 情態(tài)動詞使方法更明確蟆技。
    • [強制]不要使用一到兩個字符的名稱玩敏。
    • [建議]delegate方法名稱的開頭應(yīng)標識出發(fā)送消息的對象所屬的類。
    如:
      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    
  • 常量定義

    • [強制]使用NS_ENUM聲明枚舉類型质礼,枚舉項以枚舉類型為前綴旺聚。
    typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
        UIViewAnimationCurveEaseInOut,
        UIViewAnimationCurveEaseIn,
        UIViewAnimationCurveEaseOut,
        UIViewAnimationCurveLinear,
    };
    
    • [強制]使用NS_OPTIONS聲明位移枚舉常 ,位移枚舉常量可以組合使用眶蕉。
    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone = 0,
        UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
        UIViewAutoresizingFlexibleWidth = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
        UIViewAutoresizingFlexibleTopMargin =1<<3, 
    }
    
    • [強制]通常情況下砰粹, 不要使用宏創(chuàng)建數(shù)值和字符串常量,使 static聲明變量造挽,并在頭文件中以extern的方式暴露給外部碱璃。
    如:
    .m  :
    NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem" 
    .h  :
    extern NSString * const AFNetworkingReachabilityNotificationStatusItem;
    
    • [強制]Notification消息使用全局的NSString對象進行標識,名稱按如下方式組合:
         [Name of assoicated class] + [Did|Will] + [Unique part of name] + Notification
      如:
         UIApplicationDidEnterBackgroundNotification
    
  • 類定義

    • [強制]使用property代替成員變量饭入。
    • [建議]需要時在property聲明自定義getter或setter嵌器。
    @property(nonatomic, getter=isHidden) BOOL hidden;
    
    • [強制]需要對外公開的聲明放在.h中,其他都放在.m中谐丢。
    • [強制]+ (void)initialize必須判斷class類型爽航,因為任何繼承類也會執(zhí)行父類的initialize。
    + (void)initialize {
          if (self == [ClassName class]) {
            // ... do the initialization ...
          }
    }
    
    • [建議]使用nonnull, nullable, __kindof等 來修飾入?yún)⑶馈⒎祷刂导フ洹傩浴?/h6>
    • [建議]使 designated initializer指定初始化方法:
      1. designated initializer提供所有參數(shù),secondary initializer提供一些默認參數(shù)來調(diào)用designated initializer窄瘟。
      2. 一個類最好有一個designated初始化方法衷佃,其他初始化方法應(yīng)該調(diào)用該方法。
      3. 繼承時應(yīng)該注意:
        a. 子類designated應(yīng)該調(diào)用直接父類的designated initializer方法蹄葱。
        b. 重載直接父類的designated initializer氏义,調(diào)用你的designated initializer。
        c. 可以 __attribute((unavailable)) 標記不可用的父類designated initializer图云。
    如:
    - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
    
  • 注釋

    • [建議]使 Xcode自帶工具插入默認格式惯悠,Option+Command+/即可自動插入。
    • [建議]復(fù)雜難懂的邏輯添加注釋琼稻。
    • [建議]公共類頭文件中暴露的方法都應(yīng)該添加注釋吮螺。
  • 代碼組織

    • [建議] 一個類功能較多時饶囚,可以使用Category的方式進行功能劃分帕翻,這些Category可以放在同一個文件中鸠补。
    • [建議]使 #pragma marks - 進行方法分組。
    • [強制]合理使用group或folder組織工程結(jié)構(gòu)嘀掸,文件folder結(jié)構(gòu)和工程group結(jié)構(gòu)要對應(yīng)紫岩。
    • [建議]過期方法不要直接刪除,先標記為deprecated睬塌。
    • [建議]函數(shù)內(nèi)嵌套不要太深泉蝌,大括號嵌套大括號不要超過三層。
  • Switch

    • [強制]Switch一定要實現(xiàn)default揩晴,防止case側(cè)漏處理勋陪。
    • [強制]每個case必須寫break。
    • [強制]每個case不管多少硫兰, 用大括號括起來诅愚。

工程規(guī)范

  • CocoaPods使用規(guī)范

    • [強制]Podfile.lock文件必須提交到git版本控制,以保證版本可回溯劫映。
    • [強制]Podfile中必須指定三方庫的版本或SHA值违孝,以防意外更新。
    • [強制]區(qū)分pod install和pod update的使用場景泳赋,默認使用pod install雌桑。
    • [強制]開發(fā)pod庫在提交repo前,本地進行l(wèi)int校驗祖今。
  • Git使用規(guī)范

    • [強制]本地分支提交前校坑,使 git pull --rebase將本地分支進行rebase。
    • [強制]使用gitlab上的用戶名和郵件衅鹿,不要有多套用戶名和郵件撒踪。
       $ git config --global user.name "輸入你的名字"
       $ git config --global user.email abc@example.com
    

最佳實踐

  • 多線程

    • [強制]創(chuàng)建線程必須命名。
    • [強制]單例創(chuàng)建要使用dispatch_once確保線程安全大渤。
    • [強制]在多線程環(huán)境下使用lazy load方式加載變量有crash風險制妄,必須加鎖保護
    • [強制]performSelector:withObject:afterDelay:要在有Runloop的線程調(diào)用,否則無效泵三。
    • [強制]禁止隨意創(chuàng)建常駐線程耕捞,除非在整個App 命周期有必要且有任務(wù)運行。
    • [強制]Notification在哪個線程中post烫幕,就在哪個線程中被轉(zhuǎn)發(fā)俺抽,如果有UI操作,注意dispatch到主線程较曼。
    • [強制]禁止在主線程進 文件IO操作磷斧,必須異步處理。
    • [強制]剪貼板讀取必須放在異步線程處理。
  • 內(nèi)存管理

    • [建議]慎重使用單例弛饭,避免造成不必要的常駐內(nèi)存冕末。
    • [強制]Delegate需要使用weak引用。
    • [強制]使用block訪問self時侣颂,使用weakify和strongify避免Retain Cycle档桃。
    • [強制]strong引用子對象,weak引用父對象憔晒,基礎(chǔ)類型使 assign藻肄,NSString、NSArray拒担、block使用copy嘹屯。
    • [強制]在dealloc 法中remove observer。
    • [強制]指定repeat參數(shù)是YES的timer从撼,必須在合適的時機調(diào)用invalidate方法抚垄。
    • [強制]在init和dealloc中除非類屬性外,禁止使用self訪問屬性谋逻,只允許通過成員變量直接訪問呆馁。
      1. 在init和dealloc截斷,self是一個不完整的對象毁兆。
      2. 子類可以重寫accessor方法浙滤,在某些情況下可能導致異常。
    • [強制]在使用到UIScrollView气堕,UITableView纺腊,UICollectionView的class中,需要在dealloc中將 delegate茎芭,dataSource置為nil揖膜。
    • [強制]禁止一次性申請超過10MB的內(nèi)存。
  • 集合

    • [強制]插入對象和使用literals需要做 非空判斷梅桩。
    • [強制]注意線程安全問題壹粟,必要時加鎖,保障線程安全宿百。
    • [強制]遍歷可變集合時趁仙,先copy,再遍歷臨時變量垦页。
    • [強制]禁止mutable對象作為入?yún)鬟f雀费,禁止返回mutable對象。
    • [建議]使用NSCache 而不是NSMutableDictionary作為緩存痊焊。
    • [建議]容器使用泛型指定對象類型盏袄。
           NSArray <NSString *> *stringArray;
      
  • 字符串

    • [建議]使用keypath時忿峻,盡量使用NSStringFromSelector(@selector()),防止某個屬性被刪除后沒有編譯器檢查辕羽。
    • [建議]取substring時考慮emoji字符問題炭菌,防止截到中間crash。

    (參見:http://blog.csdn.net/liu1347508335/article/details/52484507

    • [強制]專鎖專用逛漫,一個lock對象只負責 一個任務(wù)。
    • [建議]根據(jù)不同使用場景和性能要求赘艳,使用不同類型的鎖酌毡。
    • [強制]使用鎖return前,記得unlock蕾管,如果在try catch中枷踏,記得在finally中unlock。
  • IO

    • [建議]經(jīng)常被讀取的文件做好內(nèi)存緩存掰曾,減少IO開銷旭蠕。
    • [強制] 文件存儲路徑遵守以下規(guī)則:
      1. Documents 錄:存儲用戶數(shù)據(jù),該路徑可以通過iTunes存取旷坦,會被iTunes備份掏熬。
      2. Library 錄:
        a. Preferences目錄:包含應(yīng)用程序偏好設(shè)置文件。
        b. Caches目錄:存放緩存信息秒梅, 不會被備份旗芬。
        c. tmp目錄:存放臨時文件,不會被備份捆蜀。
        d. 創(chuàng)建其他目錄:放置不希望被用戶看到的數(shù)據(jù)疮丛,會被備份。
  • Category

    • [強制]category方法加上 定義前綴辆它,防止沖突覆蓋誊薄。
    • [強制]禁 category 法覆蓋系統(tǒng)方法。

相關(guān)的pdf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锰茉,一起剝皮案震驚了整個濱河市呢蔫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飒筑,老刑警劉巖咐刨,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扬霜,居然都是意外死亡定鸟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門著瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來联予,“玉大人,你說我怎么就攤上這事》芯茫” “怎么了季眷?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卷胯。 經(jīng)常有香客問我子刮,道長,這世上最難降的妖魔是什么窑睁? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任挺峡,我火速辦了婚禮,結(jié)果婚禮上担钮,老公的妹妹穿的比我還像新娘橱赠。我一直安慰自己,他們只是感情好箫津,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布狭姨。 她就那樣靜靜地躺著,像睡著了一般苏遥。 火紅的嫁衣襯著肌膚如雪饼拍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天田炭,我揣著相機與錄音惕耕,去河邊找鬼。 笑死诫肠,一個胖子當著我的面吹牛司澎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栋豫,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼挤安,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丧鸯?” 一聲冷哼從身側(cè)響起蛤铜,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丛肢,沒想到半個月后围肥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜂怎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年穆刻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠步。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡氢伟,死狀恐怖榜轿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朵锣,我是刑警寧澤谬盐,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站诚些,受9級特大地震影響飞傀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诬烹,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一砸烦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椅您,春花似錦、人聲如沸寡键。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽西轩。三九已至员舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕畔,已是汗流浹背马僻。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留注服,地道東北人韭邓。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像溶弟,于是被迫代替她去往敵國和親女淑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348