Objective-C編程規范以及建議

方法聲明和定義

-或者+和返回類型之間須使用一個空格,括號要同行并有一個空格

方法應該像這樣:

- (void)doSomethingWithString:(NSString *)theString {
  ...
}

如果函數名字太長,可以用冒號對齊,像這樣:

- (void)doSomethingWith:(GTMFoo *)theFoo
                   rect:(NSRect)theRect
               interval:(float)theInterval {
  ...
}

當第一個關鍵字比其它的短時,要保證下一行至少有4個空格的縮進,對齊關鍵字,像這樣:

- (void)short:(GTMFoo *)theFoo
    longKeyword:(NSRect)theRect
    evenLongerKeyword:(float)theInterval {
  ...
}

方法調用

調用時所有參數應該在同一行:

[myObject doFooWith:arg1 name:arg2 error:arg3];

或者每行一個參數,以冒號對齊:

[myObject doFooWith:arg1
               name:arg2
              error:arg3];

方法定義與方法聲明一樣,當關鍵字的長度不足以以冒號對齊時,下一行都要以四個空格進行縮進

[myObj short:arg1
    longKeyword:arg2
    evenLongerKeyword:arg3];

不要使用下面的縮進風格:

[myObject doFooWith:arg1 name:arg2  // some lines with >1 arg
              error:arg3];

[myObject doFooWith:arg1
               name:arg2 error:arg3];

[myObject doFooWith:arg1
          name:arg2  // aligning keywords instead of colons
          error:arg3];

命名

對于易維護的代碼而言,命名規則非常重要。Objective-C 的方法名往往十分長,但代碼塊讀起來就像散文一樣,不需要太多的代碼注釋
當編寫純粹的 Objective-C 代碼時,我們基本遵守標準的 Objective-C naming rules

文件名

擴展名 文件分類
.h C/C++/Objective-C 的頭文件
.m Objective-C 實現文件
.mm Ojbective-C++ 的實現文件
.cc 純 C++ 的實現文件
.c 純C 的實現文件

類名

類名(以及類別、協議名)應首字母大寫,并以駝峰格式分割單詞
Objective-C 方法名
方法名應該以小寫字母開頭,并混合駝峰格式。每個具名參數也應該以小寫字母開頭方法名應盡量讀起來就像句子,這表示你應該選擇與方法名連在一起讀起來通順的參數名。(例如,convertPoint:fromRect: 或 replaceCharactersInRange:withString:)。詳情參見 Apple’s Guide to Naming Methods
第二個參數不要and:

  • 正確:- (instancetype)initWithWidth:(float)width :(float)height;

  • 不好:- (id)initWithWidth:(float)width andHeight:(float)height;

變量名

應該使用駝峰命名法,變量名盡量能夠代表其自身意思,盡量避免中英文混合命名,中英文混合命名是建議用'_'下劃線分割中英文。盡量避免如下命名方式

NSDictionary *d0 = [ACGPCacheCenter readFileAtSubDir: HSHomePageSubDirForAD];
NSDictionary *d2 = [ACGPCacheCenter readFileAtSubDir: HSHomePageSubDirForZX];
NSDictionary *d3 = [ACGPCacheCenter readFileAtSubDir: HSHPSubDirForEntry];
NSDictionary *d4 = [ACGPCacheCenter readFileAtSubDir: HSHPSubDirForCopywriting];

循環以及一些生命周期很短、很淺顯易懂的變量可以放開要求,可以使用簡單單字母等等變量名

常量名

常量名(如宏定義、枚舉、靜態局部變量等)應該以小寫字母 k 開頭,使用駝峰格式分隔單詞,
如:kInvalidHandle,kWritePerm

注釋

建議注釋不要過多,盡量能夠做到代碼自解釋。與其給類型及變量起一個晦澀難懂的名字,再為它寫注釋,不如直接起一個有意義的名字
關于注釋有以下幾點建議:

.h 文件注釋

.h 文件中 interface 前要加Document注釋,例如下面這個類,根據類名根本不知道哪個模塊,做什么的。

@interface HSHPCopywritingCell : HSBaseCollectionViewCell

@end

應改成

/**
 首頁模塊-自選股cell
 */
@interface HSHPCopywritingCell : HSBaseCollectionViewCell

@end

之后在業務代碼中遇到這個類,按住alt鍵鼠標點擊類名就可以查看到類的Description如下:

image.png

屬性以及成員變量注釋

屬性、成員變量、枚舉類型的注釋建議用 /**< 注釋內容 *////<注釋內容 進行注釋

@property (nonatomic, strong) HSMarketIndexModel *USmodel;      /**< 美股指數model */
@property (nonatomic, strong) HSMarketIndexModel *HKmodel;      /**< 港股指數model */
@property (nonatomic, strong) HSMarketIndexView *indexView;      /**< 指數view */

同樣按住alt鍵鼠標點擊類名也可以查看到類的Description,用/** 美股指數 */ 這種注釋方式也可以看到Description,不過屬性太多可能會不太美觀

代碼塊注釋

善用#pragma mark把代碼進行分類,#pragma mark沒有下劃線,#pragma mark -有下劃線分割

建議用如下類似代碼塊組織代碼:

#pragma mark - ================ LifeCycle =================
- (void)viewDidLoad {
    [self configUI];
    ...
}
- (void) viewWillAppear:(BOOL)animated {
}...

- (void)configUI {
}

#pragma mark - ================ Public Methods =================

#pragma mark ==== 核心公開方法注釋
- (void)somePublicMethod {
}

#pragma mark ==== 核心公開方法注釋2
- (void)somePublicMethod2 {
}

#pragma mark - ================ Private Methods =================

#pragma mark ==== 核心私有方法注釋
- (void)somePrivateMethod {
}

#pragma mark - ================ UITableView Delegate =================

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
}...

#pragma mark - ================ Actions =================

- (void)someButtonClicked {
}

#pragma mark - ================ Getter and Setter =================

- (void)setModelArray:(NSMutableArray *)modelArray {
}

注意:代碼塊的順序應該是由重要到不重要,Getter之類的不重要代碼塊要放在最后,確保別人打開你的類先映入眼簾的是有用的代碼


其他

保持公共API簡單

如果一個函數壓根沒必要公開,就不要這么做,屬性也是一樣,同時對方法進行合理的Document注釋,公開屬性以及常量、枚舉盡可能的用///<注釋,除非特別特別簡單的可以省略

關于警告

代碼中遇到警告信息應該盡量解決掉,有一些可能是類型轉換警告,有一些是無用的變量,代碼永遠不會被執行,已廢棄的方法等等,有一點代碼潔癖、對自己的代碼要求嚴格是一件好事

關于廢棄的代碼

項目中遇到廢棄的代碼、沒有用到的類(頭文件)、注釋掉的代碼,除非一定要保留的都要盡量刪掉,保留的寫好注釋,建議用TODO注釋,保留的原因以及相關責任人,以便其他人接手不至于懵逼~

一些建議

定義常量時:多用類型常量,少用#define預處理指令

宏定義沒有類型,有被重復定義風險,影響項目編譯速度。
建議用

static NSString * const kConst = @"Hello";
static const CGFloat kWidth = 10.0;

代替:

#define kConst @"Hello"
#define kWidth 10.0

當定義對外公開的常量的時候,我們一般使用如下定義

//Test.h
FOUNDATION_EXPORT NSString * const kClassNameconst;
//Test.m
NSString * const kClassNameconst = @"hello";

關于枚舉

推薦使用NS_ENUM和NS_OPTIONS定義

typedef NS_ENUM(NSInteger,TestEnum) {
    MY_INT_CONST = 12345
};

typedef NS_OPTIONS(NSInteger, SelectType) {
    SelectA    = 0,
    SelectB    = 1 << 0,
    SelectC    = 1 << 1,
    SelectD    = 1 << 2
};

在枚舉類型的switch語句中不要實現default分支,有一個好處是,當我們給枚舉增加成員時,編譯器就會提示開發者:switch語句并未處理所有的枚舉

盡量使用簡潔字面量語法

NSArray *animals = @[@"dog", @"pig", @"you"];
Dictionary *dict = @{@"animal":@"tiger", @"phone":@"iPhone 6"};

NSString *dog = animals[0];
NSString *iphone = dict[@"phone"];

屬性的strong、copy

定義可變類型時不要用copy修飾,會留下崩潰隱患

@property (nonatomic, copy) NSMutableArray *mutableArrayOfCopy;   ///< 插入數據時會崩潰

一般NSString 以及NSArray等等不可變類型建議用copy修飾,用strong修飾也沒錯,不過要確定情景是否真的需要strong

結尾:

本文對Objective-C編碼粗略規范以及一些淺顯建議,歡迎大家一起補充完善,共同交流進步,維護增強項目代碼的易讀性,易擴展性,健壯性等等~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容

  • 本文記錄一下Objective-C編程規范以及一些建議,可能后續會有些修改和補充,至于初衷是最近接手的項目中代碼"...
    SuperMario_Nil閱讀 1,818評論 2 13
  • 禪與 Objective-C 編程藝術 (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,641評論 1 10
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock閱讀 3,391評論 2 36
  • 老師告訴我們,這個星期會有領導到我們學校視察。 今天下午的第一節課,我們語文老師和數學老師一起給我...
    緣分天空_ddc5閱讀 205評論 0 0
  • 我的媽媽是一個護士,她長得很漂亮,也很溫柔。她有一頭烏黑的頭發,一雙明亮的眼睛,只引我一直向前走。媽媽在我生病的時...
    語滕公主閱讀 224評論 0 1