iOS代碼規(guī)范

方法聲明與定義:

1.星號前統(tǒng)一要求需要輸入空格

2.方法體左大括號于方法名的右側(cè)

3.-或者+與返回類型之間需要有空格。參數(shù)列表中,只有參數(shù)之間有空格。

-?(void)doSomethingWithString:(NSString?*)theString?{

...

}

如果一行有非常多的參數(shù),更好的方式是將每個(gè)參數(shù)單獨(dú)拆成一行。如果使用多行涡拘,將每個(gè)參數(shù)前的冒號對齊。

-?(void)doSomethingWith:(GTMFoo?*)theFoo

rect:(NSRect)theRect

interval:(float)theInterval?{

...

}

協(xié)議:

尖括號所包括的協(xié)議名稱與前面的類型標(biāo)識之間不應(yīng)該有空格

@interface?MyProtocoledClass?:?NSObject?{

@private?id?delegate;

}

方法名:

方法名應(yīng)該讀起來就像句子据德,這表示你應(yīng)該選擇與方法名連在一起讀起來通順的參數(shù)名鳄乏。

convertPoint:fromRect:

replaceCharactersInRange:withString:

訪問器方法應(yīng)該與他們getting的的成員變量的名字一樣,但不應(yīng)該以get作為前綴棘利。

例如:

-?(id)getDelegate;??//?AVOID

-?(id)delegate;?????//?GOOD

變量名:

要為變量起一個(gè)描述性的名字橱野。不要擔(dān)心浪費(fèi)列寬,若包含兩個(gè)以上單詞的命名應(yīng)該使用駝峰命名方式善玫,因?yàn)樽屝碌拇a閱讀者立即理解你的代碼更重要水援。

錯(cuò)誤的命名:

int?w;

int?nerr;

int?nCompConns;

UIButton*settingsButton;

tix?=?[[NSMutableArray?alloc]?init];

obj?=?[someObject?object];

p?=?[network?port];

正確的命名:

int?numErrors;

int?numCompletedConnections;

tickets?=?[[NSMutableArray?alloc]?init];

userInfo?=?[someObject?object];

port?=?[network?port];

星號應(yīng)緊貼變量名稱表示指向變量的指針,比如:

正確用法:

NSString *text;

不當(dāng)用法:

NSString* text;

NSString * text;

方法調(diào)用:

方法調(diào)用時(shí)茅郎,所有參數(shù)應(yīng)該在同一行

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

或者每行一個(gè)參數(shù)蜗元,以冒號對齊

[myObject?doFooWith:arg1

name:arg2

error:arg3];

[UIViewanimateWithDuration:1.0

animations:^{

// something

}

completion:^(BOOL?finished) {

// something

}];

異常:

每個(gè)@標(biāo)簽應(yīng)該有獨(dú)立的一行,在@與{}之間需要有一個(gè)空格系冗。@catch與被捕捉到的異常對象的聲明之間也要有一個(gè)空格奕扣。

@try?{

foo();

}

@catch?(NSException?*ex)?{

bar(ex);

}

@finally?{

baz();

}

條件語句的編寫:

1.為避免錯(cuò)誤,條件語句體必須使用大括號掌敬,即便語句體中的語句可以不必使用大括號(比如只有一行語句)成畦。常見的錯(cuò)誤包括在不使用大括號的情況下添加第二行語句,以為它屬于if語句的一部分涝开。此外,更可怕的事情是框仔,如果條件語句中的代碼行被注釋舀武,則本不術(shù)語條件語句的下一行代碼將變成條件語句的一部分。此外离斩,這種編碼風(fēng)格和所有其它條件語句均保持一致.

例如:

恰當(dāng)用法:

if(!error) {

returnsuccess;

}

不當(dāng)用法:

if(!error)

returnsuccess;

不當(dāng)用法2:

if(!error)returnsuccess;

2. 編寫括號內(nèi)的判斷語句時(shí)银舱,為避免手誤演變成賦值操作,一般將常量或nil放置在左邊

例如:

if(nil == self.dataList)?{

}

if(0 == theCount) {

}

Case語句

除非編譯器強(qiáng)制要求跛梗,括號在 case 語句里面是不必要的寻馏。但是當(dāng)一個(gè) case 包含了多行語句的時(shí)候,需要加上括號核偿。

switch (condition) {

case 1:

// ...

break;

case 2: {

// ...

// Multi-line example using braces

break;

}

case 3:

// ...

break;

default:

// ...

break;

}

有時(shí)候可以使用 fall-through 在不同的 case 里面執(zhí)行同一段代碼诚欠。一個(gè) fall-through? 是指移除 case 語句的 “break” 然后讓下面的 case 繼續(xù)執(zhí)行。

switch (condition) {

case 1:

case 2:

// code executed for values 1 and 2

break;

default:

// ...

break;

}

常量

相對字符串字面量或數(shù)字,我們更推薦適用常量轰绵。應(yīng)使用static方式聲明常量粉寞,而非使用#define的方式來定義宏。

例如:

恰當(dāng)用法:

static?NSString?*?const?NYTAboutViewControllerCompanyName?=@"The New York Times Company";

static?const?CGFloat NYTImageThumbnailHeight?=50.0;

不當(dāng)用法:

#define CompanyName @"The?New?York Times Company"

#define thumbnailHeight 2

枚舉類型

在使用enum的時(shí)候左腔,推薦適用最新的fixed underlying type(WWDC 2012 session 405- Modern Objective-C)規(guī)范唧垦,因?yàn)樗邆涓鼜?qiáng)的類型檢查和代碼完成功。

例如:

typedefNS_ENUM(NSInteger, NYTAdRequestState) {

NYTAdRequestStateInactive,

NYTAdRequestStateLoading

};

布爾變量

因?yàn)閚il將被解析為NO液样,因此沒有必要在條件語句中進(jìn)行比較振亮。永遠(yuǎn)不要將任何東西和YES進(jìn)行直接比較,因?yàn)閅ES被定義為1鞭莽,而一個(gè)BOOL變量可以有8個(gè)字節(jié)坊秸。

例如:

恰當(dāng)用法:

if(!someObject) {

}

不當(dāng)用法:

if(someObject==nil) {

}

以下是BOOL變量的使用:

恰當(dāng)用法:

if(isAwesome)

if(![someObject boolValue])

不當(dāng)用法:

if([someObject boolValue]==NO)

if(isAwesome==YES)// Never do this.

三目運(yùn)算

僅當(dāng)使用該運(yùn)算子可以讓代碼顯得更清晰易懂時(shí)方可使用三元運(yùn)算子,切三目運(yùn)算體內(nèi)應(yīng)均為運(yùn)算結(jié)果,不然被忽略的錯(cuò)誤比較容易產(chǎn)生撮抓。 更多情況下應(yīng)使用條件語句妇斤。使用類似if的條件語句對多種條件進(jìn)行判斷通常要更容易理解,或使用實(shí)例變量丹拯。

恰當(dāng)用法:

result=a>b?x:y;

不當(dāng)用法:

result=a>b?x=c>d?c:d:y;

CGRect函數(shù)

當(dāng)需要獲取一個(gè)CGRect矩形的x,y,width,height屬性時(shí)站超,應(yīng)使用CGGeometry函數(shù),而非直接訪問結(jié)構(gòu)體成員乖酬。

例如:

恰當(dāng)用法:

CGRect frame=self.view.frame;

CGFloat x=CGRectGetMinX(frame);

CGFloat y=CGRectGetMinY(frame);

CGFloat width=CGRectGetWidth(frame);

CGFloat height=CGRectGetHeight(frame);

不當(dāng)用法:

CGRect frame=self.view.frame;

CGFloat x=frame.origin.x;

CGFloat y=frame.origin.y;

CGFloat width=frame.size.width;

CGFloat height=frame.size.height;

單例

在創(chuàng)建單例對象的共享實(shí)例時(shí)死相,應(yīng)使用線程安全模式,獲取單例對象類方法命名使用sharedXXXX咬像。

例如:

(instancetype)sharedInstance{

staticidsharedInstance?=nil;

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,?^{

sharedInstance?=?[[self alloc] init];

});

return?sharedInstance;

}

美化代碼:

空格

方法的大括號和其他的大括號(if/else/switch/while?等) 總是在同一行開始算撮,在新起一行結(jié)束。

推薦:

if?(user.isHappy) {

//Do something

}

else?{

//Do something else

}

不推薦:

if?(user.isHappy)

{

//Do something

}?else?{

//Do something else

}

換行

self.productsRequest = [[SKProductsRequest?alloc]?initWithProductIdentifiers:productIdentifiers];

一個(gè)像上面的長行的代碼在第二行以一個(gè)間隔(2個(gè)空格)延續(xù)

self.productsRequest = [[SKProductsRequest?alloc]

initWithProductIdentifiers:productIdentifiers];

利用代碼塊

一個(gè) GCC 非常模糊的特性县昂,以及 Clang 也有的特性是肮柜,代碼塊如果在閉合的圓括號內(nèi)的話,會返回最后語句的值

NSURL?*url = ({

NSString?*urlString = [NSString?stringWithFormat:@"%@/%@", baseURLString, endpoint];

[NSURL?URLWithString:urlString];

});

所有的變量都在代碼塊中倒彰,也就是只在代碼塊的區(qū)域中有效审洞,這意味著可以減少對其他作用域的命名污染。

Pragma Mark

#pragma mark -?是一個(gè)在類內(nèi)部組織代碼并且?guī)椭惴纸M方法實(shí)現(xiàn)的好辦法待讳。 我們建議使用?#pragma mark -?來分離:

#pragma mark?- View Lifecycle (View 的生命周期)

- (void)viewDidLoad {?/* ... */?}

- (void)viewWillAppear:(BOOL)animated {?/* ... */?}

- (void)didReceiveMemoryWarning {?/* ... */?}

#pragma mark?- Custom Accessors (自定義訪問器)

- (void)setCustomProperty:(id)value {?/* ... */?}

- (id)customProperty {?/* ... */?}

建立委托者和數(shù)據(jù)源使用“weak關(guān)鍵字”

@property?(nonatomic,?weak)?id delegate;

@property?(nonatomic,?weak)?id dataSource;

默認(rèn)情況下芒澜,委托對象需要實(shí)現(xiàn) protocol 的方法〈吹可以用@required?和?@optional?關(guān)鍵字來標(biāo)記方法是否是必要的還是可選的痴晦。

@protocol?ZOCSignUpViewControllerDelegate?

@required

- (void)signUpViewController:(ZOCSignUpViewController *)controller?didProvideSignUpInfo:(NSDictionary?*);

@optional

- (void)signUpViewControllerDidPressSignUpButton:(ZOCSignUpViewController *)controller;

@end

對于可選的方法,委托者必須在發(fā)送消息前檢查委托是否確實(shí)實(shí)現(xiàn)了特定的方法(否則會 crash):

if?([self.delegate?respondsToSelector:@selector(signUpViewControllerDidPressSignUpButton:)]) {

[self.delegate?signUpViewControllerDidPressSignUpButton:self];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琳彩,一起剝皮案震驚了整個(gè)濱河市誊酌,隨后出現(xiàn)的幾起案子部凑,更是在濱河造成了極大的恐慌,老刑警劉巖术辐,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砚尽,死亡現(xiàn)場離奇詭異,居然都是意外死亡辉词,警方通過查閱死者的電腦和手機(jī)必孤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑞躺,“玉大人敷搪,你說我怎么就攤上這事〈鄙冢” “怎么了赡勘?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捞镰。 經(jīng)常有香客問我闸与,道長,這世上最難降的妖魔是什么岸售? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任践樱,我火速辦了婚禮,結(jié)果婚禮上凸丸,老公的妹妹穿的比我還像新娘拷邢。我一直安慰自己,他們只是感情好屎慢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布瞭稼。 她就那樣靜靜地躺著,像睡著了一般腻惠。 火紅的嫁衣襯著肌膚如雪环肘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天集灌,我揣著相機(jī)與錄音悔雹,去河邊找鬼。 笑死绝页,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寂恬。 我是一名探鬼主播续誉,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼初肉!你這毒婦竟也來了酷鸦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼隔,沒想到半個(gè)月后嘹裂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年寄狼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氨淌。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泊愧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盛正,到底是詐尸還是另有隱情删咱,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布豪筝,位于F島的核電站痰滋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏续崖。R本人自食惡果不足惜敲街,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袜刷。 院中可真熱鬧聪富,春花似錦、人聲如沸著蟹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萧豆。三九已至奸披,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涮雷,已是汗流浹背阵面。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洪鸭,地道東北人样刷。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像览爵,于是被迫代替她去往敵國和親置鼻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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

  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔蜓竹、可維護(hù)箕母、可靠储藐、可 測試、高效...
    iOS行者閱讀 4,455評論 21 35
  • 代碼規(guī)范 1. h文件代碼 類功能說明注釋嘶是。屬性說明注釋钙勃。方法說明注釋。類名加前綴,避免命名空間沖突. 2. m文...
    ValienZh閱讀 1,397評論 0 2
  • 對于我而言聂喇,為數(shù)不多取悅自己的方式就是辖源,發(fā)現(xiàn)一片新的大陸,或者將自己的屋子收拾成自己想要的樣子授帕。 controll...
    senpaiLi閱讀 248評論 1 1
  • 一同木、命名規(guī)范 1、統(tǒng)一要求含義清楚跛十,盡量做到不需要注釋也能了解其作用彤路,若做不到,就加注釋芥映,使用全稱洲尊,不使用縮寫。 ...
    Untils閱讀 564評論 0 0
  • 芥末烤貝殼/原創(chuàng) 親愛的奈偏,我會在未來遇到你坞嘀,并且愛上你,我們會許下度過一生的承諾惊来,從此執(zhí)子之手與子偕老丽涩。 ——引子...
    芥末烤貝殼閱讀 404評論 0 0