iOS開發(fā)規(guī)范(Objective-C版)

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

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

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

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

import "ViewController.h"

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

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

  1. 關(guān)于注釋
     最好的代碼是不需要注釋的 盡量通過合理的命名
     良好的代碼把含義表達(dá)清楚 在必要的地方添加注釋
     注釋需要與代碼同步更新
     如果做不到命名盡量的見名知意的話,就可以適當(dāng)?shù)奶砑右恍┳⑨尰蛘適ark
     1> 屬性注釋和方法聲明注釋
    使用系統(tǒng)自帶的“option+command+/”
    /**
    代理方法

@param personID 登錄ID
@param password 密碼
@param completeHandler 完成回調(diào)
*/

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

    }

3> 代碼縮進(jìn)
? 使用 xcode 默認(rèn)縮進(jìn),即 tab = 4空格
? 使用 xcode 中 re-indent 功能定期對(duì)代碼格式進(jìn)行整理
? 相同類型變量聲明需要獨(dú)行聲明
例子:
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> 對(duì)method進(jìn)行分組
      使用 #pragma mark - 方式對(duì)類的方法進(jìn)行分組
    例子:

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> 大括號(hào)寫法
    ? 左括號(hào)在方法名后隔一個(gè)空格
    例子:

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

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

  • (void)goBack {

warning 待完善

}
? 對(duì)于過期的方法、類、結(jié)構(gòu)體和枚舉等,使用系統(tǒng)自帶的deprecated系列和NS_UNAVAILABLE
方法警告。

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

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容