Objective-C代碼規範
第一話 官方代碼規範
Objective-C 編碼規範,內容來自蘋果、谷歌的文檔翻譯,自己的編碼經驗和對其它資料的總結。
概要
Objective-C 是一門面向對象的動態編程語言,主要用於編寫 iOS 和 Mac 應用程式。關於 Objective-C 的編碼規範,蘋果已經有很好的總結:
本文主要整合了對上述文檔的翻譯、作者自己的編程經驗和其他的相關資料,為公司總結出一份通用的編碼規範。
網站:http://www.cocoachina.com/ios/20150508/11780.html
第二話 自己的一些經驗之談
類(Class)命名原則
就拿“NSMutableArray”來說
NS --- 首碼(Prefix)我的理解是表示類所屬的“包”,這裡的NS就表示的是Cocoa的基礎類庫,取公司名項目名什麼的。(NS是NextStep公司的簡寫,裡面的淵源就不細說了- -)首碼的意義就在於比較直觀的劃分了類的所屬和範圍。像Cocos2d里的首碼就是CC,box2d裡面是B2,UserInterface->UI,CoreFoundation->CF,CoreGraphics->CG。如果我也能寫一個開源架構或模塊的話,我應該會取“SY”或是“Sunny”吧 :)
MutableArray --- 類名,簡短明確的形容類所表示的內容。首字母大寫,駝峰標示。另外值得註意的是,由於NSMutableArray是NSArray的擴展子類,本質上形容的都是Array,所以應該保留父類的識別字樣“Array”,但NSObject到NSArray不應該起名成NSArrayObject,也是避免了語義的重疊。
成員變數與屬性存取器(Accessor)命名原則
這也是讓我糾結了挺久,一直不懂為什麼很多代碼裡面類成員變數出現了下劃線"_",而屬性存取方法@property聲明時不加下劃線,實現時@synthesize又令兩個名字相等。
@interface SunnyTest : NSObject { NSArray * _array; } @property (nonatomic,retain) NSArray * array; @end
@implementation SunnyTest @synthesize array = _array; @end
這樣做的原因很簡單,就是不暴露實例的成員變數,外界只能用@property聲明的存取名來訪問成員變數,所以就用下滑線加以區分。
但在類內方法訪問成員變數時就直接使用帶下劃線的名字,個人認為不要用self.xxxxx來使用,因為使用存取器本來就是對外的,在內部使用可能會造成一些不必要的錯誤,比如:
self.array = [[NSArray alloc] init]; //記憶體泄露
這時就會造成記憶體泄露,因為[[NSArray alloc] init]生成NSArray對象之後賦值給self.array,由於array的存取方法中包含retain,這會使retainCount變成2,而實際應該是1,記憶體泄露且很難發現。
改成這樣的寫法也是蘋果官方推薦的。
_array = [[NSArray alloc] init];
方法(Method)起名規則
一個規範的方法讀起來應該像一句完整的話,讀過之後便知函數的作用。執行性的方法應該以動詞開頭,小寫字母開頭,返回性的方法應該以返回的內容開頭,但之前不要加get。
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
+ (id)arrayWithArray:(NSArray *)array;
如果有參數,函數名應該作為第一個參數的提示信息,若有多個參數,在參數前也應該有提示信息(一般不必加and)
一些經典的操作應該使用約定的動詞,如initWith,insert,remove,replace,add等等。