代碼規範[iOS]

 

1、文件系統

  • 總則
    1. 文件的物理路徑和邏輯路經保持統一
    2. 每一個業務文件夾下都是MVC大結構
    3. 若是有支持性的VC,這個VC寫在和View、Model平行的文件夾Vendor文件夾裏面
    4. 公用的文件放在最外面

 

  • 文件命名
    1. 文件夾及文件首字母大寫,符合駝峯命名規範
    2. 業務類不須要前綴(PT、HDF,PT是用戶維護通用的前綴),若是是公用的非業務層須要加前綴,依據做用範圍使用PT或者HDF做爲前綴
    3. 數據Model以Model結尾
    4. 業務Model以Manager、Handler、Helper等結尾
    5. 宏文件以Macro結尾

 

  • 文件順序
    1. 業務文件夾下依次是大ViewController、Model、View
    2. View文件夾裏面順序是按照頁面佈局自上向下羅列,若是單個區域view嵌套多能夠建一個文件

 

  • 資源文件
    1. 圖片文件都放在 images.xcassets裏
    2. 文件結構
      1. 一級目錄:醫生品牌     
      2. 二級目錄:點評、服務星(業務)
      3. RTF文本文檔放在業務文件夾最上面的層,打開業務文件夾就能看到
    3. 命名
      1. 都以「yspp_」開頭
      2. 二級前綴依據圖片大小和用途分4個二級前綴yspp_btn_、yspp_icon_、yspp_image_、yspp_screen_  (全屏的圖)。

 

文件結構:正則表達式

資源文件結構:算法

 

2、代碼結構

  • 總則
    1. 聲明文件 ( .h 文件)中不能聲明實例變量
    2. 實現文件 ( .m 文件)中不聲明屬性
    3. #import 相關
      1. #import 都寫在.m文件裏,  .h文件用@class 引用。(.h  只是聲明)
      2. #import不能有重複和沒有用到的
      3. #import作小的分區分區,分別是:1.本身的View、Model類、2.其餘有交互的類、3.工具、類目等
    4. 全部方法名都小寫,有前綴的,需把前綴小寫加下槓線。(如HDFActionSheet, hdf_actionsheetDidSelected...)
    5. 方法命名不留and   以一個流利的英文句子爲基準
    6. 若是方法參數有集合類型的,用泛型標記
      - (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0)__TVOS_PROHIBITED; // supercedes -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil
  • 聲明文件 ( .h 文件)  
    1. 順序(自上向下)
      • 1.#import
      • 2. 枚舉
      • 3. 宏
      • 4. 常量
      • 5. delegate聲明
      • 6. 屬性
      • 7. 方法
      • 8. delegate實現
    2. 屬性
      • .h 屬性不聲明可變對象,可變對象放在 .m實例變量裏聲明,若是外面須要讀取,封裝個getter方法,返回不可變對象。
        • @interface DoctorHonoursNetwork : NSObject
          - (void)addItem:(NSObject *)a;
          - (NSArray *)mArray;
        • @interface DoctorHonoursNetwork ()
          {
              NSMutableArray *_mArray;
          }
      • 除「)」左邊,聲明語句每一個單詞或逗號後面都加空格,(順序:內存管理語義-原子性-讀寫屬性)  @property (nonatomic, assign)  NSString *doctorId; 
      • 屬性是不可變對象都用Copy屬性。
      • 可變的屬性(Mutable)須要原子操做(atomic)
      • 屬性的註釋推薦使用方式:/**註釋內容*/,這樣寫在點語法時能夠直接展現註釋
    3. 方法作分區
      • 若是共公方法多的話作小的功能分區。
    4. delegate
      • 在@interface以前聲明,在@end以後實現
      • 方法名都以類名開頭(小寫),而且自身做爲必傳參數傳回 (- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;)
        • - (void) viewDidDisplay:(UIView *)selfView;
          - (void) view(UIView *)selfView didDisplay;   (不正確的寫法)
      • 每一個方法必須傳回自身
      • delegate必須是weak,避免循環引用

 

  • 實現文件( .m 文件)  
    1. 實例變量
      • 只在 .m的延展裏聲明實例變量  (    @interface NSObject ()    )
      • 命名都以 「_」開頭
      • 直接用實例變量賦值,若是被賦值對象是NSString、NSArray ,且賦值對象是可變的類,用copy方法賦值。
    2. 生命週期方法結構
      • #pragma mark - life cycle
        • dealloc 最上面
        • 初始化方法
        • 按照頁面展示生命週期寫 (willAppear、didAppear、willDisappear、DidDisappear)
      • #pragma mark - delegates
        • #pragma mark -- delegate1   (注意第二層中間是兩個槓)
        • #pragma mark -- delegate2
      • #pragma mark - event response
        • 方法名以Action結尾 如:backAction、rightItemAction、handleAlertAction
      • #pragma mark - public methods
        • .h中聲明的方法
      • #pragma mark - private methods
        • 命名以p_開頭  如:p_methodA
        • 延展裏聲明一下
        • #pragma mark -- UI
      • #pragma mark - getter/setter
        • getter 省略get
        • BOOL類型的 前面加is   (isShowed)
      • #pragma mark - network methods

 

聲明文件:數據庫

 

實現文件:( Part 1)編程

 

實現文件:( Part 2)數組

 


3、常量  宏

    1. 命名
      • 通用的宏常量和宏函數都大寫,單詞中間用「_」
      • 私用的宏方法用」__「(兩個下槓線開頭)所有小寫
      • 公有的加YSPP_前綴
      • 私有的確保惟一性,以類名開頭,避免覆蓋定義
      • 宏函數參數必須用括號括起來(宏只是文本替換)
    2. 文件
      1. 若是該業務的宏比較多,須要單獨建文件,以Macro結尾。放在最大做用域頂級文件夾下面。
  • 常量
    1. 命名
      • 通用的以  FOUNDATION_EXTERN 開頭(FOUNDATION_EXTERN NSString * constCommentNotification )
      • 私用的不須要 FOUNDATION_EXTERN  須要加 static 關鍵字
         
      • 通用的須要加類名確保惟一性
      • 都以」k"開頭
    2. 對象
      • 通用的定義在.h裏 ,賦值寫在 .m裏
        • .h FOUNDATION_EXTERN NSString * const kCommentNotification;
        • .m NSString * const kCommentNotification = @"CommentNotification";
      • 私有的寫在.m裏
        • .m NSString * const kCommentNotification = @"CommentNotification";

 

 

 


4、佈局方式  數據持久化

 
  • 佈局方式
    • 寫頁面方式
      • 純代碼    
      • Xib  
      • StoryBoard(多人開發噩夢)
  •  
    • 佈局方式
      • 手算佈局
      • AutoResizing(已捨棄)
      • AutoLayout
    • 最終確認佈局方式兩種:
      • 純代碼  ————>  手算佈局
      • Xib       ————> AutoLayout (可視化)
  • 數據持久化
    • 寫文件
    • 歸檔
    • NSUserDefault數據庫
      • 引導圖,一些小數據的存儲
      • 命名
        • key命名 kUserDefault_…
        • 輸出一個Const文件,專門存儲key
      • 維護文檔
    • CoreData
    • ANKeyValueCache  緩存對象,能夠是多個對象(流草稿、患教草稿、點評草稿)

    • 最終確認兩種數據持久化方式
      • NSUserDefault
        • 引導圖,一些小數據的存儲
        • 命名
          • key命名 kUserDefault_…
          • 輸出一個Const文件,專門存儲key
        • 維護文檔
      • ANKeyValueCache  緩存對象,能夠是多個對象(流草稿、患教草稿、點評草稿)

 

 

 


5、網絡

 
  • 文件
    1. 在最大的業務文件夾寫一個NetworkManager,全部業務網絡請求寫在這個裏面。參見PatientEducationNetwork.h。
    2. 命名以NetworkManager結尾
  • 結構
    1. 請求方法以每一個頁面爲緯度分區,#pragma mark - 
    2. .h  和.m  方法順序同樣
  • 方法註釋
    1. 說明方法用途,和必要參數說明,顯而易見的參數如patientId,userId不用註釋
    2. 註釋方法用途和必要註釋參數,各佔一行。多個參數寫在一行上。
  • 方法命名
    • 都以request或post開頭,且是類方法(+方法)
  • 接口定義
    1. 接口名定義用常量,寫在  .m裏面
    2. 以kAPI_開頭的  const指針
    3. NSString *const kAPI_doctoruser_getDoctorRecommendInfo =@"doctoruser_getDoctorRecommendInfo";
  • 成功失敗回調都用 HDFNetResponse 做爲參數。
  • 失敗處理
    1. 除非產品特殊要求,失敗都應該有提示 [SVProgressHUDshowErrorWithStatus:ERROR_MSG_NONETWORK];
    2. 若是是大WebView頁面須要作失敗處理點擊從新加載的頁面(HDFEmptyView)
    3. 若是是列表頁,若是數據源是空的須要處理處理點擊從新加載的頁面,數據源不爲空只給提示ERROR_MSG_NONETWORK

 

文件:緩存

 


6、類目、延展

  • category 類目
    1. 命名
      • 類目命名:主類名+大寫字母開頭的,能歸納這個類目意義的單詞  (NSString+SizeToFit)
      • 方法命名:類目名+功能名,防止多個類目使用定義功能相同且命名相同方法,互相覆蓋
    2. 當一個過於臃腫的大類中的方法能夠根據功能類型分組,則將每一組作成一個類目
    3. 一個功能類目對應一個文件,一個類目就是一組相同功能類型的方法簇,不要在一個文件中寫多個不一樣功能類目方法
    4. 通常狀況下,不容許在類目中覆蓋現有類中的方法,只在類目中擴展新方法
    5. 不容許在類目中定義屬性,如有這種需求,定義在主類裏,或採用繼承解決。(不要用關聯對象,不是蘋果提倡的作法)
  • extension 延展
    1. 類延展只寫在主類的.m文件中,不容許新建文件
    2. 將私有方法原型寫在延展中,對外隱藏。
    3. 延展中建議只定義私有實例變量,不定義屬性

 

 

 


7、內存、線程

  • 內存泄漏相關
    1. 循環引用類內存泄漏
      • 禁止在成員集合變量中添加成員變量 (例:[_dataArray  addObject: _button1])
      • 設置代理時使用weak指針 
      • 使用block時,會出現兩種循環引用,若是出現循環引用,在block中使用block的持有者時須要使用weak引用
      • NSTimer若是設置了重複執行模式,則須要在dealloc中進行invalidate;或者使用block類型的NSTimer 
    2. 申請了不釋放類內存泄漏
      • 代碼中使用了通知中心,add了幾個,就須要在dealloc方法中對應remove掉幾個
      • 使用橋接將Foundation對象轉爲CoreFoundation對象時,說明此對象脫離ARC管理,需手動調CFRelease釋放
      • 代碼中使用了GCD隊列,須要本身手動釋放
      • 自定義GCD隊列group,須要本身手動釋放
    3. 控制內存峯值
      • 作tableView的時候,使用reuse機制,不然只要tableView不釋放,越滑動佔用內存越大
      • 若是在循環中有內存操做,則在循環中嵌套autoreleasePool塊

 

  • 線程安全,併發數控制
    1. 總述:線程控制簡單的狀況下,優先使用GCD,由於GCD用法最簡單,抽象層級最低,效率最高;線程控制複雜狀況下使用NSOperation,其餘的pthread和NSPthread都禁止使用;少用自定義派發隊列。
    2. 線程安全
      • 常規寫法:
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT), 0), ^{     
                     //可並行執行的處理
                      dispatch_async(dispatch_get_main_queue(), ^{
                          //只能在主線程執行的處理
                      });
        });
      • 單例所有使用dispatch_once來寫,目前最可靠的保證單例建立代碼不可重入的方式。
      • 增刪改臨界區數據的操做需同步,使用dispatch_sync來作,調用dispatch_sync方法自動給臨界區數據加鎖。
      • 讀臨界區數據不需同步,能夠異步提升效率
      • 使用dispatch_barriers實現讀寫鎖(異步讀,同步寫)
      • 自定義DispatchQueue的名稱使用應用程序ID逆序域名(dispatch_queue_create(「newPatient.haodf.com」, NULL))
      • 使用dispatch_group時,添加到group中的派發任務使用相同派發的隊列(效率低)
      • dispatch_sync的第一個參數禁止傳入當前所在隊列(死鎖)
    3. 併發數控制:
      • 建議使用 GCD配合 Dispatch Semaphore ,本質上就是個帶計數的鎖
      • 使用maxConcurrentOperationCount,本質上也是個帶計數的鎖
      • 平時客戶端編程,併發數控制在3個如下
      • 同類型操做可使用GCD開啓多線程,使用Dispatch Semaphore 控制最大併發數,建立Dispatch Semaphore時,將鎖計數設置爲3,保證線程數<=3;
        例:不一樣類型操做,調用一次dispatch_async就會增長一個線程,若是同一個時間片內併發線程有可能超過3個,就將線程加入dispatch_group,等待dispatch_group執行結束後,再執行第四條線程,保證線程數<=3;

 

 

 

 


8、其餘

  • 埋點
    1. 命名  UM_YSPP_…….
    2. 文件  MobClickEvent.h,寫在最下面  分區
    3. 方式
      • Click        [MobClick event:UM_DOCTOR_SERVICESTAR_CODEPAGE_RULES];
      • 頁面   
        • - (void) viewWillAppear:(BOOL)animated {
           [MobClick beginLogPageView:UM_DOCTOR_SERVICESTAR_PREVIEWPAGE];
          [MobClick event:UM_DOCTOR_SERVICESTAR_PREVIEWPAGE];
          }
        • - (void) viewWillDisappear:(BOOL)animated {
          [MobClick endLogPageView:UM_DOCTOR_SERVICESTAR_PREVIEWPAGE];
          }

 

  • 工程文件、證書
    • 除修改證書、引用文件/庫、提測修改版本號/build號、重構ARC代碼,不容許修改工程文件。

 

  • AppDelegate
    • 推送
      • 代碼
        • 都在AppDelegate  didReceiveRemoteNotification 處理
        • 分激活狀態和未激活狀態
        • [UIAlertView showWithTitle:@"舒適提示" message:[[userInfo objectForKey:@"aps"]objectForKey:@"alert"] cancelButtonTitle:@"查看詳情" otherButtonTitles:@[@"取消"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) { 
                    //處理通知相關
          }];
      • 數據格式
        • aps是公用參數
        • module是大業務
        • cm是子業務
    • app跳轉(URL Scheme)
      安全

      醫生版 患者版
      微信   wx8afb167c8108d3a9 好大夫患者      haodfpappscheme
      QQ     QQ41D0E0C0 支付                 hdfPatientAlixPay
      微博   wb3026699592 微博                 weiboOAuth
      好大夫患者   haodfappscheme 微信                 wxc7dfdd26c004598c
      好大夫醫生   doctorappscheme QQ                   QQ06027529
        QQ空間            tencent100824361

       

       

 

 


9、版本控制、上線相關

  • 版本控制
    • 一些引導圖版本號,只在當前版本出來,用戶跳着升級不出來。
    • 數據版本號,考慮數據的有效版本。
  • 上線
    • 若是是打上線包須要改的地方 須要加    #warning 上線
    • 上線前確認:
      • 搜索 #warning 上線 修改須要改的地方
      • 醫生版
        • 註釋掉全部環境宏
      • 患者版
        • 確認HDFNetworkManager 的 self.productReleasing = YES;微信

 

 


10、附錄1(公共庫)

 

序號
功能
對應庫文件
備註
1
數據解析                  
MJExtension
 
2
網絡        
HDFNet
 
3
彈窗提示              
SVProgressView                       
 
4
上拉下拉刷新
MJRefresh
 
5
用戶信息
HDFUserManager
 
6
緩存
ANKeyValueCache
 
7
網絡圖片
SDWebImage
 
8
大圖預覽              
PTImageShowViewController
 
9
蒙層引導圖          
AppGuideABS
注意版本控制
10
分享
醫生版:PTShareSheet
患者版:YMSharedManager.h
 
11
sheet
HDFActionSheet
 
12
語音識別
科大訊飛  iFly
 
13
語音識別輸入框
XunfeiTextView
 
14
錄音 播放    
HDFVoiceRecorder
 

 

 


11、附錄2(公共類目)

 

序號
功能
對應文件
備註
1

NSArray相關擴展API網絡

NSArray+HDFArray NSArray的排序/JSON互轉/是否包含String
2

NSData相關擴展API多線程

NSData+HDFData

NSDate+Addition

String和二進制互轉+各類加密算法
3 日期相關擴展 NSDate+HDFDate 全部和年月日星期,閏年等有關的日期操做
4 NSDictionary相關擴展API NSDictionary+HDFDictionary NSDictionary和JSON互轉,安全獲取鍵值對
5 文件相關擴展 NSFileManager+HDFFileManager 檢驗文件是否存在、是否超時、判斷文件大小
6 可變數組相關擴展API NSMutableArray+HDFMutableArray 可返回成功/失敗狀態的交換,移除,插入
7 可變字典相關擴展API NSMutableDictionary+HDFMutableDictionary 帶空值檢測,可安全的添加對象,網絡請求參數,安全存儲
8 經常使用的基類擴展API NSObject+HDFObject

一、獲取類名 二、獲取文本寬高 三、角度弧度互轉 四、隨機數 五、對象JSON互轉 
六、判斷是否安裝某應用 七、判斷是否能打開某個Itunes應用的連接 八、app跳轉

九、打開應用在App Store上的連接 十、移除全部值爲null的key-value

9 NSString相關擴展API NSString+HDFString 一、加密 二、斷言 三、URL包裝 四、過濾HTML標籤 五、前綴後綴 六、獲取文件路徑 七、獲取沙盒路徑 八、判斷是否包含字符串 九、匹配非表情符號的正則表達式
10 定時器相關擴展 NSTimer+HDFTimer 一、block版本定時器(防內存泄露) 二、啓動,暫停
11 偏好設置擴展 NSUserDefaults+HDFUserDefaults 更加安全的方式讀寫UserDefaults
12 ActionSheet擴展 UIActionSheet+HDFActionSheet block回調方式
13 彈窗擴展 UIAlertView+HDFAlertView 一、block回調方式 二、全部樣式的彈窗構造方法
14

UIColor相關擴展API

UIColor+HDFHYBColor 一、根據顏色生成圖片 二、根據同一顏色生成不一樣透明度顏色
15 UIControl擴展API UIControl+HDFControl 按鈕各類點擊狀態回調,值改變(segment)回調
16 設備相關擴展API UIDevice+HDFDevice 獲取全部設備相關屬性
17 手勢相關擴展API UIGestureRecognizer+HDFGesture 手勢擴展API,block方式回調
18

快速設置UILabel的attributedText屬性的擴展API

UILabel+HYBAttributedCategory

快速設置UILabel的attributedText屬性的API

19 導航條相關擴展API UINavigationBar+HDFNavigationBarTransluent

快速設置導航條的各類屬性

20 UITextView相關擴展API UITextView+HDFTextView 設置UITextView的佔位提示語
21 UIView相關擴展API

UIView+HDFView

UIView+Frame

快速獲取UIView寬高位置等佈局屬性
22 各類系統控件的簡潔建立配置 UIKitMaker 各類系統控件的簡潔建立配置
23 計算文字高度

NSString+ParagrapshStyleSize

NSString+ParagraphSzie

使用attribute方式計算文字高度
24

快速由xib文件建立UITableViewCell

UITableViewCell+InitCell 只適用於xib畫出來的cell
25 富文本 NSMutableAttributedString+LBAttributeString Attribute方式製做富文本
26 UITableViewController擴展 UIViewController+MessageRightBarButtonItem 帶右上角未讀標誌的控制器
27 UITabbarItem擴展 UITabBarItem+CustomBadge 帶未讀標誌的tabbarItem
28 UIImage擴展1 UIImage+Extend 一、得到帶顏色圖片 二、縮放圖片
29 UIImage擴展2 UIImage+Blur 一、圖片模糊效果 二、屏幕快照
30 計算文字size和高度 NSString+sizeWithFont 計算文字size和高度(boundingRectWithSize方式)
31 快速建立圖片button UIButton+image 快速建立圖片button

12、附錄3(公共控件)

 

序號
功能
對應文件
備註
1 空數據頁面 PTEmptyDataView  
2 定位功能 PTLocation  
3 底部彈出菜單 HDFActionSheet  
4 循環滾動banner SDCycleScrollView  
5 橫向滾動視圖 HorizonTableView  
6 進度條 HUDProgressView  
7 自定義tabbar(不可滾動) HDFPageIndexView  
8 自定義tabbar(可滾動) PTTabbar  
9 上下級聯段選標籤+控制器(相似網易新聞) PTTabbarControllerFacade(PTTabbar+PTTabbarController)  
10 本地草稿 ANKeyValue
相關文章
相關標籤/搜索