1.項目基礎
1.1 項目新建信息
- Product Name:工程名碍讯。
- Team:開發(fā)者賬號信息西轩,沒有選擇None员舵,個人開發(fā)者賬號(含Personal Team),公司/企業(yè)賬號(如:XXX Co.,LTD)遭商,也可以暫時選擇None固灵,后續(xù)再配置調(diào)試。
- Organization Name:個人開發(fā)者賬號(自定義名字)劫流,公司/企業(yè)賬號(如:XXX Co.,LTD),此處內(nèi)容明顯體現(xiàn)在代碼文件頭部注釋中丛忆。
- Organization Identifier:個人開發(fā)者賬號(自定義標識)祠汇,公司/企業(yè)賬號(域名反寫如:com.xxx)。
- Bundle Identifier:自動生成格式為 [Organization Identifier] + [Product Name]熄诡,也可后續(xù)配置時進行修改可很。
- Language:根據(jù)需要選擇Objective-C 或者 Swift。
- Use Core Data:根據(jù)項目情況勾選凰浮,如果明確需要請直接勾選我抠,也可后續(xù)添加。
- Include Unit Tests:單元測試袜茧,根據(jù)需要勾選菜拓,也可后續(xù)添加。
- Include UI Tests:UI測試笛厦,根據(jù)需要勾選纳鼎,也可后續(xù)添加。
- Source Control:默認git進行版本管理裳凸,根據(jù)需要勾選贱鄙,也可后續(xù)添加。
1.2 項目初始配置
- Display Name:應用名稱姨谷。
- Deployment Info:系統(tǒng)版本逗宁、設備、屏幕方向梦湘、狀態(tài)欄等瞎颗,
- Build Active Architecture Only:一般Debug模式YES,Release模式NO践叠。如果Release模式為YES言缤,那么上傳AppStore之后會顯示大量而具體的兼容設備,Release模式為NO則僅顯示模糊的兼容信息禁灼。
- Architecture:默認$(ARCHS_STANDARD)不作修改管挟。
- Valid Architecture:默認arm64/armv7/armv7s不作修改。模擬器32位處理器是i386架構弄捕,模擬器64位處理器是x86_64架構僻孝,真機32位處理器是armv7或armv7s架構导帝,真機64位處理器是arm64架構。
1.3 項目文件結構
- 所有的文件應放在工程中的項目目錄下穿铆。
- 項目文件和物理文件需保持一致您单。
- Xcode創(chuàng)建的任何組(group)都必須有文件夾映射。
- 項目文件不僅可以按照業(yè)務類型分組荞雏,也可以根據(jù)功能分組虐秦。
2.代碼格式規(guī)范
這是小編的iOS開發(fā)交流群:624212887,里面都是iOS開發(fā)凤优,全棧發(fā)展悦陋,歡迎入駐!——點擊:加入
2.1 代碼注釋格式
-
文件注釋:采用Xcode自動生成的注釋格式筑辨。
// // AppDelegate.h // 項目名稱 // // Created by 開發(fā)者姓名 on 2018/6/8. // Copyright ? 2018年 公司名稱. All rights reserved. //
-
import注釋:如果有一個以上的import語句俺驶,對這些語句進行分組,每個分組的注釋是可選的棍辕。
// Framework #import <UIKit/UIKit.h> // Model #import "WTUser.h" // View #import "WTView.h"
-
方法注釋:Xcode8之后快捷鍵自動生成(option + command + /)暮现。
/** <#Description#> @param application <#application description#> @param launchOptions <#launchOptions description#> @return <#return value description#> */ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
-
代碼塊注釋:單行的用 “// + 空格” 開頭, 多行用“/* */”楚昭。
2.2 代碼結構與排版
聲明文件:方法順序和實現(xiàn)文件的順序保持一致栖袋,根據(jù)需要用”#pragma mark -“將方法分組。
實現(xiàn)文件:必須用”#pragma mark -“將方法分組哪替。分組前后優(yōu)先級:Lifecycle方法 > Public方法 > UI方法 > Data方法 > Event方法 > Private方法(邏輯處理等) > Delegate方法 > 部分Override方法 > Setter方法 > Getter方法栋荸。
#pragma mark - Lifecycle
- (instancetype)init {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)viewDidAppear:(BOOL)animated {}
- (void)viewWillDisappear:(BOOL)animated {}
- (void)viewDidDisappear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}
- (void)dealloc {}
#pragma mark - Public
- (void)refreshData {}
#pragma mark - UI
- (void)initSubViews {}
#pragma mark - Data
- (void)initData {}
- (void)constructData {}
#pragma mark - Event
- (void)clickButton:(UIButton *)button {}
#pragma mark - Private
- (CGFloat)calculateHeight {}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {}
#pragma mark - Override
- (BOOL)needNavigationBar {}
#pragma mark - Setter
- (void)setWindow:(UIWindow *)window {}
#pragma mark - Getter
- (UIWindow *)window {}
-
變量:優(yōu)先使用屬性聲明而非變量聲明,注意屬性修飾符凭舶、變量類型晌块、變量之間的間隔。
@property (strong, nonatomic) UIWindow *window;
點語法:應始終使用點語法來訪問和修改屬性帅霜。
-
間距要求如下:
- 一個縮進使用四個空格匆背。
- 在”-“或者”+“號之后應該有一個空格,方法的大括號和其它大括號始終和聲明在同一行開始身冀,在新的一行結束钝尸,另外方法之間應該空一行。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (door.isClosed) { // Do something } else { // Do something } return YES; }
-
長度要求如下:
- 每行代碼的長度不應該超過100個字符搂根。
- 單個函數(shù)或方法的實現(xiàn)代碼控制在50行以內(nèi)珍促。
- 單個文件里的代碼行數(shù)控制在500~600行之內(nèi)。
3.代碼命名規(guī)范
3.1 代碼命名基礎
最好是既清晰又簡短剩愧,但不要為簡短喪失清晰性猪叙,并使用駝峰命名法。
-
名稱通常不縮寫,即使名稱很長也要拼寫完全(禁止拼音)穴翩,然而可使用少數(shù)非常常見的縮寫犬第,部分舉例如下:
常用縮寫詞 含義 常用縮寫詞 含義 app application max maximum alt alternate min minimum calc calculate msg message alloc allocte rect rectangle dealloc deallocte msg message init initialize temp temporary int integer func function 由于Cocoa(Objective-C)沒有C++一樣的命名空間機制,需添加前綴(公司名首字母)防止命名沖突芒帕,前綴使用2個字符(以下統(tǒng)稱項目前綴)歉嗓。
常見的單詞略寫:ASCII,PDF,HTTP,XML,URL,JPG,GIF,PNG,RGB等
3.2 類和協(xié)議命名
- 類名應明確該類的功能,并且要有項目前綴防止命名沖突背蟆。
- 協(xié)議組合一組相關的方法鉴分,不關聯(lián)具體的一個類,使得某些相似類有統(tǒng)一的接口带膀,這種協(xié)議的命名應采用動名詞形式(ing)冠场,例如:NSLocking。
- 協(xié)議組合一些不相關的方法(主要是避免創(chuàng)建多個獨立的協(xié)議)本砰,僅僅關聯(lián)某一個具體的類(該類是協(xié)議的具體體現(xiàn)者),這種協(xié)議用該類名命名钢悲,例如:NSObject点额。
- 委托形式的協(xié)議命名為類名加上Delegate,例如:UIScrollViewDelegate莺琳。
3.3 變量和屬性命名
變量名應前置下劃線“_”,屬性名沒有下劃線还棱。
-
屬性本質上是存取方法setter/getter,可進行重寫(注意內(nèi)存管理)。
@property (strong, nonatomic) UIWindow *window; - (void)setWindow:(UIWindow *)window; - (UIWindow *)window;
-
可以適當?shù)膶etter/getter進行別名設置惭等。
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;
3.4 方法和函數(shù)命名
方法名和函數(shù)名一般不需要前綴珍手,但函數(shù)(C語言形式)作為全局作用域的時候最好加上項目前綴。
表示行為的方法名稱以動詞開頭辞做,但不要使用do/does等無實際意義的助動詞琳要。
-
參數(shù)前面的單詞要能夠描述該參數(shù),并且參數(shù)名最好能用描述該參數(shù)的單詞命名秤茅。
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
-
方法中多個參數(shù)可以使用適當?shù)慕樵~進行連接稚补。
// 后續(xù)多個參數(shù)使用with - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; // 添加適當介詞能夠使方法的含義更明確 - (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit; // 第一個參數(shù)用了with,后面的參數(shù)不使用with - (instancetype)initWithImage:(nullable UIImage *)image highlightedImage:(nullable UIImage *)highlightedImage;
-
只有在方法返回多個值的時候使用get單詞進行明確框喳。
- (void)getLineDash:(nullable CGFloat *)pattern count:(nullable NSInteger *)count phase:(nullableCGFloat *)phase;
-
方法返回某個對象實例课幕。
+ (instancetype)buttonWithType:(UIButtonType)buttonType;// 類方法創(chuàng)建對象 + (UIApplication *)sharedApplication;// 單例命名
-
委托或代理方法命名第一個參數(shù)最好能相關某個對象。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
私有方法不要以下劃線“_“開頭五垮,因為系統(tǒng)私有方法保留此方式乍惊。
-
自定義方法和系統(tǒng)方法重名,建議在方法開頭加前綴”xx_methodName“放仗。
3.5 常量和宏的命名
const常量外部聲明:在Objective-C文件中優(yōu)先采用FOUNDATION_EXTERN和UIKIT_EXTERN润绎,而非C語言中的extern。
const常量采用駝峰命名原則。
const常量根據(jù)作用域適當加上前綴(含項目前綴):可供外部使用需加上相應的類名或者模塊前綴凡橱,僅文件內(nèi)部使用需要加上小寫字母“k”.
宏定義每個字母采用大寫小作,單詞之間用下劃線“_”間隔。
-
宏定義也可根據(jù)作用范圍加上適當前綴稼钩,避免命名沖突顾稀。
3.6 枚舉的命名
使用枚舉來定義一組相關的整數(shù)常量,增強代碼的可讀性坝撑。
枚舉可根據(jù)作用域添加前綴(含項目前綴)静秆,格式:[相關類名或功能模塊名] + [描述] + [狀態(tài)]。
建議優(yōu)先采用Objective-C的聲明NS_ENUM和NS_OPTIONS巡李,少采用C語言形式的enum等枚舉聲明.
-
枚舉定義時需指定None狀態(tài)抚笔,并且其rawValue一般為起始值0。
// NS_ENUM typedef NS_ENUM(NSInteger, UIStatusBarAnimation) { UIStatusBarAnimationNone = 0, UIStatusBarAnimationFade = 1, UIStatusBarAnimationSlide = 2, } typedef NS_OPTIONS(NSUInteger, UIRemoteNotificationType) { UIRemoteNotificationTypeNone = 0, UIRemoteNotificationTypeBadge = 1 << 0, UIRemoteNotificationTypeSound = 1 << 1, UIRemoteNotificationTypeAlert = 1 << 2, UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3, }
3.7 通知命名
外部聲明:在Objective-C文件中優(yōu)先采用FOUNDATION_EXTERN和UIKIT_EXTERN侨拦,而非C語言中的extern殊橙。
-
通知的命名一般都是跨文件使用的,需添加項目前綴狱从。
// [相關聯(lián)類名或者功能模塊名] + [will/Did](可選) + [描述] + Notification UIApplicationDidEnterBackgroundNotification UIApplicationWillEnterForegroundNotification
3.8 類型別名命名
- 根據(jù)作用域添加前綴(含項目前綴)膨蛮,格式:[類名或功能模塊名] + [描述]。
4.文件資源命名規(guī)范
資源文件命名也需加上項目前綴季研。
資源文件名全小寫敞葛,單詞之間用下劃線“_”間隔。
資源文件命名格式:[項目前綴] + [業(yè)務] + [文件名]
-
圖片文件命名格式:[項目前綴] + [業(yè)務] + [類型] + [狀態(tài)]与涡。
// 常見類型:logol,icon,img // 常見狀態(tài):normal,selected,highlight UIImage *image = [UIImage imageNamed:@"wt_mine_setting_normal"];
5.代碼警告處理
注意警告問題的隱蔽性惹谐,因此最好修復警告。
警告類型的查看步驟:選中警告 -> 右鍵Reveal in Log(不編譯Reveal in Log是灰色的驼卖,因此先編譯) ->查看方括號的內(nèi)容
-
如果需要忽略警告氨肌,建議優(yōu)先代碼push或者pop處理。
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" // 造成警告的代碼 #pragma clang diagnostic pop
-
如果警告數(shù)量過大款慨,檢查警告類型以及必要性儒飒,可xcode配置忽略此類型警告。步驟:選中工程 -> TARGETS -> Build Settings -> Other Warning Flags檩奠。
忽略單個和全局配置稍有差別桩了,如下舉例: push/pop Other Warning Flags -Wformat —-> -Wno-format -Wunused-variable —-> -Wno-unused-variable -Wundeclared-selector —-> -Wno-undeclared-selector -Wint-conversion —-> -Wno-int-conversion
也可以在pch等大范圍作用域的頭文件中添加代碼來忽略后續(xù)警告:#pragma clang diagnostic ignored “警告名稱” 。
6.外部庫文件引入
- 庫文件引入最好把警告處理掉埠戳。
- 庫文件引入優(yōu)先采用CocoaPods引入井誉,并且指定版本號。
-
源文件方式需引入文件到工程目錄下整胃。
- 源文件方式需注意有無版本說明信息(可能在README文件中颗圣,也可能在某個.h頭文件中,又或者有Version文件)沒有時需在庫文件目錄下新增版本說明文件,
7.代碼版本管理
版本管理工具:svn 或 git在岂。
svn文件管理配置:目錄~/.subversion打開config文件全局配置global-ignore奔则,所有的倉庫都會受到影響,而svn:ignore只影響倉庫目錄蔽午。
-
git文件管理配置:.gitignore_global為全局配置易茬,而倉庫目錄下的.gitignore文件僅注明本倉庫被git忽略的文件,常見語法如下:
- 井號(#)用來添加注釋用的及老,比如 "#注釋"抽莱。
- build/* : 星號()是通配符,build/則是要說明要忽略 build 文件夾下的所有內(nèi)容骄恶。
- *.pbxuser : 表示要忽略后綴名為.pbxuser的文件食铐。
- !default.pbxuser : 感嘆號(!)是取反的意思,*.pbxuser 表示忽略所有后綴名為.pbxuser的文件僧鲁,如果加上!default.pbxuser則表示虐呻,除了default.pbxuse忽略其它后綴名為pbxuse的文件。
-
提交信息規(guī)范:
- BUG類型為“Fix + [BUG編號] + [BUG描述]”寞秃。
- 任務類型為“Done + [任務編號] + [任務描述]”铃慷。
- 任務中間態(tài)為“Doing + [任務編號] + [任務描述]”。
- 引入類庫為“import + [類庫名]”蜕该。
8.構建和分發(fā)
- 手動構建:Xcode界面化構建注、xcodebuild終端命令構建洲鸠。
- 自動化構建:Jenkins+Fastlane堂淡、xcodebuild腳本執(zhí)行 。
- 內(nèi)測分發(fā)渠道:fir.im扒腕、蒲公英等绢淀。
- 線上分發(fā)渠道:AppStore。
總結
希望本文的內(nèi)容對大家具有一定的參考學習價值瘾腰,同時歡迎大家進入小編iOS開發(fā)交流群:624212887皆的,互相探討技術!——點擊:加入