iOS開發規范(Objective-C版)

  1. 關于命名
     1> 統一要求
    ? 含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋
    ? 使用全稱,不適用縮寫
     2> 類的命名
    ? 大駝峰式命名:每個單詞的首字母都采用大寫字母
       例子:MFHomePageViewController
    ? 后綴要求
      ViewController: 使用ViewController做后綴
     例子: MFHomePageViewController
    View: 使用View做后綴
    例子: MFAlertView
    UITableCell:使用Cell做后綴
    例子: MFNewsCell
    Protocol: 使用Delegate或者DataSource作為后綴
    例子: UITableViewDelegate
    UI控件依次類推
    3> 方法命名
    ? 小駝峰式命名,每一段都以小寫字母開頭,后面的單詞首字母大寫
    ? 要符合英語語法,使方法名簡單干練,便于理解,語義通順
    正確示例:
  • (NSInteger)heightOfAttributedString:(NSAttributedString *)attributedString byLimitWidth:(CGFloat)limitWidth;
    錯誤示例:
  • (NSInteger)getAttributedStringHeightWithString:(NSAttributedString )string widthValue:(int)width;
    4> 私有變量
    ? 小駝峰式命名:第一個單詞以小寫字母開始,后面的單詞的首字母全部大寫
      例子:firstName、lastName
    ? 以 _ 開頭,第一個單詞首字母小寫
      例子:NSString * _somePrivateVariable;
    ? 私有變量放在 .m 文件中聲明 
     5> property變量
    ? 小駝峰式命名
       例子:
    /
    *
    用戶名
    */
    @property (nonatomic, copy) NSString *userName;
    ? 禁止使用synthesize關鍵詞
     6> 宏命名
    ? 全部大寫,單詞間用 _ 分隔。[不帶參數]
      例子: #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
    ? 以字母 k 開頭,后面遵循大駝峰命名。[不帶參數]
      例子:#define kWidth self.frame.size.width
    ? 小駝峰命名。[帶參數]
    例子:

define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]

7> Enum
? Enum類型的命名與類的命名規則一致
? Enum中枚舉內容的命名需要以該Enum類型名稱開頭
  例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
8> Delegate命名
? 當另一個對象中可能用到該類的多個實例時,類的實例必須為回調方法的參數之一, 如

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    ? 回調方法的參數只有類自己的情況,方法名要符合實際含義, 如:
    • (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      ? 以類的名字開頭(回調方法存在兩個以上參數的情況)以表明此方法是屬于哪個類的, 如:
    • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      ? 充分利用動詞的不同時態例如did和will通知Delegate已經發生的變化或將要發生的變化, 如:
        - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
  1. 私有方法、屬性及變量聲明
     1> 聲明位置
    在.m文件中最上方。如果需要顯示到頭文件,可以使用@private進行修飾。
       例子1:

import "ViewController.h"

@interface ViewController ()
// 在這個category(類目)中定義變量和方法
@end

@implementation ViewController {
// 聲明私有變量
}
例子2:
@interface ViewController : UIViewController {
@private
NSString *name;
}

  1. 關于注釋
     最好的代碼是不需要注釋的 盡量通過合理的命名
     良好的代碼把含義表達清楚 在必要的地方添加注釋
     注釋需要與代碼同步更新
     如果做不到命名盡量的見名知意的話,就可以適當的添加一些注釋或者mark
     1> 屬性注釋和方法聲明注釋
    使用系統自帶的“option+command+/”
    /**
    代理方法

@param personID 登錄ID
@param password 密碼
@param completeHandler 完成回調
*/

  • (void)loginWithPersonID:(NSString *)personID password:(NSString *)password completeHandler:(void (^)(checkLogon *result))completeHandler;
  1. 關于UI布局
     推薦使用純代碼寫UI,方便其他人修改和理解。除了UITableViewCell,這個類使用xib具有一定的優勢。
     Xib文件的命名與其對應的.h文件保持相同
     Xib文件中控件的組織結構要合理,Xib文件中控件需要有合理的可讀性強的命名,方便他人理解
  2. 格式化代碼
     1> 指針 "" 位置
      定義一個對象時,指針 "
    " 靠近變量
       例子: NSString *userName;
     2> 方法的聲明和定義
    在 - 、+ 和 返回值 之間留一個空格,方法名和第一個參數之間不留空格
  • (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {

    }

3> 代碼縮進
? 使用 xcode 默認縮進,即 tab = 4空格
? 使用 xcode 中 re-indent 功能定期對代碼格式進行整理
? 相同類型變量聲明需要獨行聲明
例子:
CGFloat oringX = self.view.frame.origin.x;
CGFloat oringY = self.view.frame.origin.y;
CGFloat lineWidth = self.view.frame.size.width;
? Method與Method之間空一行
例子:
@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    }

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }
     4> 對method進行分組
      使用 #pragma mark - 方式對類的方法進行分組
    例子:

pragma mark – 私有方法

  • (void)samplePrivateMethod {
    //...
    }

  • (void)sampleForIf {
    //...
    }

  • (void)sampleForWhile {
    //...
    }

  • (void)sampleForSwitch {
    //...
    }

  • (void)wrongExamples {
    //...
    }

pragma mark – 公有方法

  • (void)samplePublicMethodWithParam:(NSString*)sampleParam {
    //...
    }

pragma mark – 生命周期

  • (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    //...
    }

  • (void)viewDidLoad {
    //...
    }

  • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //...
    }
     5> 大括號寫法
    ? 左括號在方法名后隔一個空格
    例子:

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    }
    ? 任何需要寫大括號的部分,不得省略
      錯誤示例:

  • (void)wrongExamples {
    BOOL someCondition = YES;
    if (someCondition)
    NSLog(@"this is wrong!!!");
    while(someCondition)
    NSLog(@"this is wrong!!!");
    }
    6> 警告
    ? 需要添加警告的地方寫上warning和注釋,在編譯的過程中會注意到
    示例:

  • (void)goBack {

warning 待完善

}
? 對于過期的方法、類、結構體和枚舉等,使用系統自帶的deprecated系列和NS_UNAVAILABLE
方法警告。

  1. 目錄格式
    1> 根據項目的功能從大塊到小塊對文件用不同的文件夾進行分裝;
    2> 按照項目的功能進行分類的,文件夾用中文命名;
    3> 按照代碼的功能進行分類的,文件夾可以用英文或中文命名;
    4> 第三方庫和工具單獨存放到一個文件夾;
    5> 根據情況,小尺寸圖片統一放到Assets.xcassets,同樣用文件夾分類存放;
    6> 其他圖片,尤其是大圖,要放在boundle里,一般放在“/Resources/圖片/”里;
    7> 通用的類,根據視圖、模型和控制器的分類用不同文件夾分類存放;
    8> 具體到某一個小模塊,則根據MVC對文件進行分類。
  2. git代碼管理
    1> 先更新,再提交;
    2> 提交的時候帶上自己的名字,干了什么就寫什么,不得遺漏;
    3> 有重要的提交,要通知一下其他組員;
    4> git分支用版本號作為后綴。
  3. 其他細節
    1> 在Runtime+KVC面前成員變量沒有公私之分,建議全部使用@property聲明屬性,“私有變量”的放在.m文件中的extension中聲明即可,.h文件中公開的屬性應合理使用readonly修飾。使用@property還有個優勢,方便內存管理,規避循環引用;
    2> 控制器類中的代碼盡量不要超過500行,借助繼承、多態、封裝三大特性和MVC、MVVM思想簡化、拆分代碼;
    3> 避免使用left、right、123等字樣進行View控件命名,以免后續的UI修改導致命名沖突;
    4> 聲明UIView及其子類屬性盡量用weak修飾;
    5> ARC環境下聲明NSArray/NSDictionary/NSString屬性,用copy;聲明前三者可變子類屬性用strong;
    6> 擁有相同功能的類封裝成父類;
    7> control+i 組合鍵,自動對齊;
    8> MJRefresh、AFNetworking在迭代過程中都出現過修改方法名的情況,比較成熟的解決方案是創建橋梁分類,封裝常用的方法。如果第三方庫出現命名修改,只要修改橋梁分類中的內容即可,不用每個類都去改方法,節省大量時間。這種解耦思想同樣適用于NSTimer,能主動解除循環引用。詳情見[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自釋放定時器];
    9> 盡量不要在預編譯頭文件里引入太多文件,盡量精簡;
    10> 分類(category)根據功能進行分類和命名;
    11> 圖片命名根據模塊(子模塊)功能進行命名;
    12> 注意對象的內存釋放問題,防止循環引用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載自:http://www.cocoachina.com/ios/20150508/11780.html,僅僅個...
    前進的碼農閱讀 743評論 0 1
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內容...
    i得深刻方得S閱讀 4,752評論 1 9
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 概述在iOS開發中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,090評論 3 38
  • 沒有人可以完全信任,包括你自己 人性是丑陋的 是貪婪的 更是自私的 在生活這條路上,你會遇到許許多多的人,也許是志...
    七曜Seven閱讀 260評論 0 0