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

  1. 關于命名
     1> 統(tǒng)一要求
    ? 含義清楚谱邪,盡量做到不需要注釋也能了解其作用赦拘,若做不到肃拜,就加注釋
    ? 使用全稱,不適用縮寫
     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> 宏命名
    ? 全部大寫赶么,單詞間用 _ 分隔肩豁。[不帶參數(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命名
? 當另一個對象中可能用到該類的多個實例時,類的實例必須為回調(diào)方法的參數(shù)之一, 如

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    ? 回調(diào)方法的參數(shù)只有類自己的情況放闺,方法名要符合實際含義, 如:
    • (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      ? 以類的名字開頭(回調(diào)方法存在兩個以上參數(shù)的情況)以表明此方法是屬于哪個類的, 如:
    • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      ? 充分利用動詞的不同時態(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進行修飾篡悟。
       例子1:

import "ViewController.h"

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

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

  1. 關于注釋
     最好的代碼是不需要注釋的 盡量通過合理的命名
     良好的代碼把含義表達清楚 在必要的地方添加注釋
     注釋需要與代碼同步更新
     如果做不到命名盡量的見名知意的話,就可以適當?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. 關于UI布局
     推薦使用純代碼寫UI匾寝,方便其他人修改和理解搬葬。除了UITableViewCell,這個類使用xib具有一定的優(yōu)勢艳悔。
     Xib文件的命名與其對應的.h文件保持相同
     Xib文件中控件的組織結構要合理急凰,Xib文件中控件需要有合理的可讀性強的命名,方便他人理解
  2. 格式化代碼
     1> 指針 "" 位置
      定義一個對象時猜年,指針 "
    " 靠近變量
       例子: NSString *userName;
     2> 方法的聲明和定義
    在 - 抡锈、+ 和 返回值 之間留一個空格,方法名和第一個參數(shù)之間不留空格
  • (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 待完善

}
? 對于過期的方法爹土、類吮螺、結構體和枚舉等,使用系統(tǒng)自帶的deprecated系列和NS_UNAVAILABLE
方法警告饱溢。

  1. 目錄格式
    1> 根據(jù)項目的功能從大塊到小塊對文件用不同的文件夾進行分裝;
    2> 按照項目的功能進行分類的瘦馍,文件夾用中文命名碳褒;
    3> 按照代碼的功能進行分類的,文件夾可以用英文或中文命名莲组;
    4> 第三方庫和工具單獨存放到一個文件夾诊胞;
    5> 根據(jù)情況,小尺寸圖片統(tǒng)一放到Assets.xcassets锹杈,同樣用文件夾分類存放撵孤;
    6> 其他圖片,尤其是大圖竭望,要放在boundle里邪码,一般放在“/Resources/圖片/”里;
    7> 通用的類咬清,根據(jù)視圖闭专、模型和控制器的分類用不同文件夾分類存放;
    8> 具體到某一個小模塊旧烧,則根據(jù)MVC對文件進行分類影钉。
  2. git代碼管理
    1> 先更新,再提交掘剪;
    2> 提交的時候帶上自己的名字平委,干了什么就寫什么,不得遺漏杖小;
    3> 有重要的提交肆汹,要通知一下其他組員;
    4> git分支用版本號作為后綴予权。
  3. 其他細節(jié)
    1> 在Runtime+KVC面前成員變量沒有公私之分昂勉,建議全部使用@property聲明屬性,“私有變量”的放在.m文件中的extension中聲明即可扫腺,.h文件中公開的屬性應合理使用readonly修飾岗照。使用@property還有個優(yōu)勢,方便內(nèi)存管理笆环,規(guī)避循環(huán)引用攒至;
    2> 控制器類中的代碼盡量不要超過500行,借助繼承躁劣、多態(tài)迫吐、封裝三大特性和MVC、MVVM思想簡化账忘、拆分代碼志膀;
    3> 避免使用left熙宇、right、123等字樣進行View控件命名溉浙,以免后續(xù)的UI修改導致命名沖突烫止;
    4> 聲明UIView及其子類屬性盡量用weak修飾;
    5> ARC環(huán)境下聲明NSArray/NSDictionary/NSString屬性戳稽,用copy馆蠕;聲明前三者可變子類屬性用strong;
    6> 擁有相同功能的類封裝成父類惊奇;
    7> control+i 組合鍵互躬,自動對齊;
    8> MJRefresh赊时、AFNetworking在迭代過程中都出現(xiàn)過修改方法名的情況吨铸,比較成熟的解決方案是創(chuàng)建橋梁分類,封裝常用的方法祖秒。如果第三方庫出現(xiàn)命名修改,只要修改橋梁分類中的內(nèi)容即可舟奠,不用每個類都去改方法竭缝,節(jié)省大量時間。這種解耦思想同樣適用于NSTimer沼瘫,能主動解除循環(huán)引用抬纸。詳情見[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自釋放定時器];
    9> 盡量不要在預編譯頭文件里引入太多文件耿戚,盡量精簡湿故;
    10> 分類(category)根據(jù)功能進行分類和命名;
    11> 圖片命名根據(jù)模塊(子模塊)功能進行命名膜蛔;
    12> 注意對象的內(nèi)存釋放問題坛猪,防止循環(huán)引用。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皂股,一起剝皮案震驚了整個濱河市墅茉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呜呐,老刑警劉巖就斤,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蘑辑,居然都是意外死亡洋机,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門洋魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绷旗,“玉大人喜鼓,你說我怎么就攤上這事〉蟊辏” “怎么了颠通?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膀懈。 經(jīng)常有香客問我顿锰,道長,這世上最難降的妖魔是什么启搂? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任硼控,我火速辦了婚禮,結果婚禮上胳赌,老公的妹妹穿的比我還像新娘牢撼。我一直安慰自己,他們只是感情好疑苫,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布熏版。 她就那樣靜靜地躺著,像睡著了一般捍掺。 火紅的嫁衣襯著肌膚如雪撼短。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天挺勿,我揣著相機與錄音曲横,去河邊找鬼。 笑死不瓶,一個胖子當著我的面吹牛禾嫉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚊丐,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼熙参,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吠撮?” 一聲冷哼從身側響起尊惰,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泥兰,沒想到半個月后弄屡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鞋诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年膀捷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削彬。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡全庸,死狀恐怖秀仲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壶笼,我是刑警寧澤神僵,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站覆劈,受9級特大地震影響保礼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜责语,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一炮障、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坤候,春花似錦胁赢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徒河,卻和暖如春吹害,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虚青。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留螺男,地道東北人棒厘。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像下隧,于是被迫代替她去往敵國和親奢人。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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

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