代碼規(guī)范

頭文件#import的順序

寫法模板
import <系統(tǒng)庫>
import <第三方庫>
import “其他類”
盡量按照先系統(tǒng)類 第三方類 自己寫的類順序?qū)?中間不能有空格

建議的寫法

import <UIKit/UIKit.h>
import "ViewController.h"
import "IOSMD5.h"

不建議的寫法

import "ViewController.h"
import "IOSMD5.h"
import <UIKit/UIKit.h>

代碼組織

在函數(shù)分組和protocol/delegate實(shí)現(xiàn)中使用#pragma mark -來分類方法屿衅,要遵循以下一般結(jié)構(gòu):

#pragma mark - Lifecycle
- (instancetype)init {}
- (void)dealloc {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}

空格

縮進(jìn)使用4個空格蚁署,確保在Xcode偏好設(shè)置來設(shè)置伴鳖。
方法大括號和其他大括號(if/else/switch/while 等.)總是在同一行語句打開但在新行中關(guān)閉。

建議的寫法

if (user.isHappy) { 
    //Do something
} else { 
    //Do something else
}

不建議的寫法

if (user.isHappy)
{ 
    //Do something
}
else 
{ 
    //Do something else
}

方法參數(shù)之間換行

應(yīng)該避免以冒號對齊的方式來調(diào)用方法。因?yàn)橛袝r方法簽名可能有3個以上的冒號和冒號對齊會使代碼更加易讀。請不要這樣做,盡管冒號對齊的方法包含代碼塊宣肚,因?yàn)閄code的對齊方式令它難以辨認(rèn)。

建議的寫法

// blocks are easily readable
[UIView animateWithDuration:1.0 animations:^{ 
    // something
} completion:^(BOOL finished) { 
    // something
}];

不建議的寫法

// colon-aligning makes the block indentation hard to read
[UIView animateWithDuration:1.0 
                              animations:^{ 
                                  // something 
                              } completion:^(BOOL finished) { 
                                 // something 
                             }];

@Class的寫法

建議的寫法

@class SecondViewController, ChangeViewController;

不建議的寫法

@class SecondViewController;
@class ChangeViewController;

@Interface的寫法

寫法模板
@interface 類名 : 父類 <協(xié)議1, 2="">
@interface和類名中間一個空格
類名后緊跟:之后空格加上父類協(xié)議之間用,空格分割

建議的寫法

@interface AppDelegate : UIResponder <UIApplicationDelegate>

不建議的寫法

@interface AppDelegate:UIResponder<UIApplicationDelegate>

@protocol的寫法

寫法的模板
@protocol 協(xié)議的名稱 <協(xié)議1, 2="">
@potocol和協(xié)議的名稱有空格 協(xié)議的名稱和其他協(xié)議有空格 其他協(xié)議之間有空格

建議的寫法

@protocol AHShoppingCartPreparePayProtocal <NSObject>

不建議的寫法

@protocol AHShoppingCartPreparePayProtocal<NSObject>

@property的寫法

@property (關(guān)鍵詞, 關(guān)鍵詞) 類 *變量名稱;
關(guān)鍵詞用,空格分割 類前后空格

建議的寫法

@property (nonatomic, strong) UIButton *userSettingBtn;

不建議的寫法

@property(nonatomic, strong) UIButton * userSettingBtn;

h頭文件方法寫法

寫法模板
@interface
方法的參數(shù)在一排顯示
方法之間保留一行
第一個方法和@interface保留空行
最后一個方法和@end保留空行

建議的寫法

@interface AHProductShowViewController : UIViewController

- (void)setWidgetInfo:(AHWidgetInfo *)widgetInfo;

@end

不建議的寫法

@interface AHProductShowViewController : UIViewController
- (void)setWidgetInfo:(AHWidgetInfo *)widgetInfo;
@end

點(diǎn)符號語法

點(diǎn)語法是一種很方便封裝訪問方法調(diào)用的方式悠栓。當(dāng)你使用點(diǎn)語法時,通過使用getter或setter方法按价,屬性仍然被訪問或修改惭适。
點(diǎn)語法應(yīng)該總是被用來訪問和修改屬性,因?yàn)樗勾a更加簡潔楼镐。[] 符號更偏向于用在其他例子癞志。

建議的寫法

NSInteger arrayCount = self.array.count;
view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;

不建議的寫法

NSInteger arrayCount = [self.array count];
[view setBackgroundColor:[UIColor orangeColor]];
[[UIApplication sharedApplication] delegate];

注釋一定要寫

自己管理的類一定注釋屬性用途 方法的用途 參數(shù)的說明
屬性如果設(shè)置默認(rèn)值 一定注明默認(rèn)值是什么
如果方法內(nèi)部存在邏輯判斷 方法跳轉(zhuǎn) 一定注釋判斷用法 方法跳轉(zhuǎn)用法
除了初始化操作
其他聲明變量 賦值 判斷 應(yīng)該注明注釋用途

注釋的寫法

Class類注釋

/**
 控制的 cell
 */
@interface CRMControlTableViewCell : UITableViewCell

property屬性的注釋

/** 
  已經(jīng)選擇的字段 
  */
@property (nonatomic, strong) NSMutableArray *selecteds;

方法的注釋

如果有返回值 請加上return

/**
 @method isCustomerContantImportByName:phone:
 @abstract  根據(jù)姓名和電話號查詢顧客
 @discussion 根據(jù)姓名和電話號查詢顧客
 @param name customer's name phone customer's phone
 @result 返回一組一個字符串(男/女/nil)對象
 */
+ (NSString *)isCustomerContantImportByName:(NSString *)name phone:(NSString *)phoneNumber;

Block注釋

/**
 @method syncDeviceUpdateTimeSuccess:failure:
 @abstract 客戶端修改設(shè)備更新時間的接口
 @discussion 客戶端修改設(shè)備更新時間的接口
 @param onSuccess 成功回調(diào)
 @param onFailure 失敗回調(diào)
 */
- (void)syncDeviceUpdateTimeSuccess:(void (^)())onSuccess failure:(void (^)(NSError *))onFailure;

NSUM 的注釋

/*!
  當(dāng)前輸入框的狀態(tài)
  - ATFVEditStateNormal  : 默認(rèn) 還沒有輸入任何的文字
  - ATFVEditStateEditing  :  正在進(jìn)行輸入
  - ATFVEditStateEdited   :  輸入完畢
  - ATFVEditStateNoEdit  :  不允許編輯
  */
typedef NS_ENUM(NSUInteger , ATFVEditState) {
    ATFVEditStateNormal,
    ATFVEditStateEditing,
    ATFVEditStateEdited,
    ATFVEditStateNoEdit
};

計(jì)算符號兩邊要有空格

比如 + - * / =等運(yùn)算符左右有空格

建議的寫法

x = 1 + 2;

不建議的寫法

x=1+2;

控件命名的規(guī)范

對于命名一定不要簡寫 那篇很長的單詞 但是一些單詞就是簡寫的除外 比如WTO RMB
UILabel結(jié)尾加上Label;
UIImageView結(jié)尾記上ImageView
等等讓其他的編程人員看名字就知道變量的用法 和屬于什么控件

建議的寫法

@property (nonatomic, strong) UILabel *nameLabel;

不建議的寫法

@property (nonatomic, strong) UILabel *name;

對于#define宏命名

單詞全部的大寫 單詞之間用_分割

建議的寫法

#define WEB_ROOT_IP @"qa.amway.com.cn"

不建議的寫法

#define kAHPaymentCenterRelease @"NO"

對象調(diào)用方法要留空格

建議的寫法

[[NSNotificationCenter defaultCenter] removeObserver:self];

不建議的寫法

[[NSNotificationCenter defaultCenter]removeObserver:self];

對于局部的變量盡量的初始化

局部的變量要初始化 屬性有默認(rèn)的值

建議的寫法

int index = 0;

不建議的寫法

int index;

變量名的規(guī)范

一定要使用駝峰的命名

建議的寫法

CRMNetService *netService = [CRMNetService sharedInstance];

不建議的寫法

CRMNetService *netservice = [CRMNetService sharedInstance];

使用NSUserDefaults要先創(chuàng)建

因?yàn)槲覀冇玫絅SUserDefaults無非是保存和讀取 事先的創(chuàng)建一個對象 可以精簡代碼
當(dāng)執(zhí)行方法很多 用變量替換

建議的寫法

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSNumber *lastSyncTime = [userDefaults valueForKey:[self lastSyncTimeKey]];

不建議的寫法

[[NSUserDefaults standardUserDefaults] valueForKey:[self lastSyncTimeKey]];

條件語句

條件語句主體為了防止出錯應(yīng)該使用大括號包圍,即使條件語句主體能夠不用大括號編寫(如框产,只用一行代碼)凄杯。這些錯誤包括添加第二行代碼和期望它成為if語句;還有秉宿,even more dangerous defect可能發(fā)生在if語句里面一行代碼被注釋了戒突,然后下一行代碼不知不覺地成為if語句的一部分。除此之外描睦,這種風(fēng)格與其他條件語句的風(fēng)格保持一致膊存,所以更加容易閱讀。

建議的寫法

if (!error) {
    return success;
}

不建議的寫法

if (!error) return success;

黃金路徑

當(dāng)使用條件語句編碼時忱叭,左手邊的代碼應(yīng)該是"golden" 或 "happy"路徑隔崎。也就是不要嵌套if語句,多個返回語句也是OK韵丑。

建議的寫法

- (void)someMethod { 
    if (![someOther boolValue]) { 
        return; 
    } 
    //Do something important
}

不建議的寫法

- (void)someMethod { 
    if ([someOther boolValue]) { 
        //Do something important 
    }
}

錯誤處理

當(dāng)方法通過引用來返回一個錯誤參數(shù)爵卒,判斷返回值而不是錯誤變量。

建議的寫法

NSError *error;
if (![self trySomethingWithError:&error]) { 
    // Handle Error
}

不建議的寫法

NSError *error;
[self trySomethingWithError:&error];
if (error) { 
    // Handle Error
}

類名加上前綴避免沖突

因?yàn)閳F(tuán)隊(duì)的合作 可能會出現(xiàn)大家想到一樣的名字或者添加第三方庫引入和第三方庫名字一樣
盡量加上前綴撵彻。
如果只針對工程就使用工程的縮寫
比如自己個人的第三方庫就加上自己名字或者昵稱的縮寫

建議的寫法

@interface CRMAddEditGroupViewController : UIViewController

不建議的寫法

@interface AddEditGroupViewController : UIViewController

盡可能使用不可變的對象

對于OC存在很多可變的對象 比如NSMutableString NSMutableArray NSMutableDictionary等等
對于一些不允許改變的直接使用不可變對象
可以節(jié)省對象開支 還可以防止別人修改數(shù)據(jù)造成bug

建議的寫法

NSArray *sexList = @[@"男",@"女"];

不建議的寫法

NSMutableArray *sexList = [NSMutableArray arrayWithArray:@[@"男",@"女"]];

對于一些自己不確定的可以使用try catch

對于不知道后臺返回什么類型的 可以使用try catch

建議的寫法

int index = 0;
@try {
    NSArray *array = obj[@"list"];
    index = [array.firstObject intValue];
}
@catch { }

不建議的寫法

int index = 0;
NSArray *array = obj[@"list"];
if (array.count > 0) {
    index = [array.firstObject intValue];
}

使用dispatch_once來創(chuàng)建單例

建議的寫法

+ (instancetype)sharedInstance { 
    static id sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
        sharedInstance = [[self alloc] init]; 
    });
    return sharedInstance;
}

便利的寫法

如果只需要便利數(shù)組和字典的寫法用for in

建議的寫法

for (NSString *name in names) {

}

不建議的寫法

for (int i = 0; i < names.lenght; i ++) {

}

字典的元素垂直寫

建議的寫法

NSDictionary *dictionary = @{
                                                   @"a" : @"",
                                                   @"b" : @"",
                                                   @"c" : @""
                                                 };

不建議的寫法

NSDictionary *dictionary = @{@"a" : @"", @"b" : @"", @"c" : @"" }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钓株,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子千康,更是在濱河造成了極大的恐慌享幽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拾弃,死亡現(xiàn)場離奇詭異值桩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豪椿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門奔坟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携栋,“玉大人,你說我怎么就攤上這事咳秉⊥裰В” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵澜建,是天一觀的道長向挖。 經(jīng)常有香客問我,道長炕舵,這世上最難降的妖魔是什么何之? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮咽筋,結(jié)果婚禮上溶推,老公的妹妹穿的比我還像新娘。我一直安慰自己奸攻,他們只是感情好蒜危,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睹耐,像睡著了一般辐赞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疏橄,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天占拍,我揣著相機(jī)與錄音,去河邊找鬼捎迫。 笑死晃酒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窄绒。 我是一名探鬼主播贝次,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彰导!你這毒婦竟也來了蛔翅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤位谋,失蹤者是張志新(化名)和其女友劉穎山析,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掏父,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笋轨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爵政。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅讽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钾挟,到底是詐尸還是另有隱情洁灵,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布掺出,位于F島的核電站徽千,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏汤锨。R本人自食惡果不足惜罐栈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泥畅。 院中可真熱鬧,春花似錦琅翻、人聲如沸位仁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聂抢。三九已至,卻和暖如春棠众,著一層夾襖步出監(jiān)牢的瞬間琳疏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工闸拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留空盼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓新荤,卻偏偏與公主長得像揽趾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苛骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • GB代碼規(guī)范 頭文件#import的順序(商量) 寫法模板#import <系統(tǒng)庫>#import <第三方庫>#...
    君賞閱讀 976評論 0 1
  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔篱瞎、可維護(hù)、可靠痒芝、可 測試俐筋、高效...
    iOS行者閱讀 4,459評論 21 35
  • 推薦文章:禪與 Objective-C 編程藝 前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔、可維護(hù)严衬、...
    WolfTin閱讀 2,757評論 0 1
  • 復(fù)古風(fēng)可是把以往的流行元素重新吹了一遍,其實(shí)時尚都是這樣周而復(fù)始的闷哆。近段時間那個亮亮的絲絨又火起來了腰奋。 說實(shí)話,在...
    舉個LEE子閱讀 431評論 0 0
  • 本地私有庫不能滿足團(tuán)隊(duì)開發(fā)的需要抱怔,存在一下問題: 需要主動指明路徑劣坊,然后庫的本地位置就不能動了,否則Podfile...
    Lovell_閱讀 384評論 0 0