1.命名git
1 |
extern ushort APIDefaultPageSize; // 還行,能明白意思了 |
爲了舉例,咱們假定有 User
、Tag
、Category
這幾種 model 類型。github
對象展現通常分列表和單個詳情,其 view controller 分別使用 ModelListController 和 ModelDetailController,推薦的語素順序是:Model名 + 限定與修飾 + ListController|DetailController
。舉例說明:json
1 |
// OK |
常常爲了便於多個界面複用,咱們會把 model 的顯示統一在一個 view controller 中,在其餘界面嵌入這個 view controller。咱們把這類專門管理顯示的 view controller 叫作 displayer
。如:多線程
1 |
UserListDisplayer |
UIView 級別的組件不要以 Controller 或 Displayer 結尾,若是起到管理做用可使用 control 結尾。函數
動機工具
把 model 名放在首位(如 TagUserLikedListController 而不是 UserLikedTagListController)的主要考量是便於搜索。由於 Xcode 不支持亂序搜索,關鍵詞只能從前日後纔會有結果。性能
若是限定詞在前,由於不一樣人理解差別,本身也會遺忘,這個限定詞常常是輸入不能的,只能搜 TagList 再從列表中查找,等於第一位的查找語素就廢掉了。當 model 類型在第一位時,基本上熟悉這個項目的人都清楚要查找的視圖顯示的是什麼類型,第一位正確了,後面添加/修改限定就很方便了。ui
另外一個便利的場景是參考以前界面實現另外一個界面時,查找的大都是相同類型的界面,如實現 UserFollowerListController 參考 UserFollowingListController;而相同限定的場景比較少見,像 UserLikedTagListController 參考 UserLikedCategoryListController 的可能性就較少。編碼
PS: 務必常用 Xcode 的 Open Quickly(默認快捷鍵 Command+Shift+O)spa
alloc
、copy
、init
、mutableCopy
、new
開頭的方法要注意,它們會改變ARC的行爲。[^1]get
、set
開頭的方法有特殊的意義,不要隨意定義。
set
開頭,可用 setup
替代。userInfomation
,而不是 getUserInfomation
。例:
1 |
Objective-C |
1 |
Objective-C |
好的協議名應能馬上讓人分辨出這不是一個類名,除了以經常使用的 delegate、dateSource 作結尾外,還可使用 …ing 這種形式,如:NSCoding
、NSCopying
、NSLocking
。
基本命名格式是:[與通知相關的類名] + [Did | Will] + [UniquePartOfName] + Notification
,例:
1 |
Objective-C |
1 |
// OK |
推薦的前綴:
前綴 | 含義 |
---|---|
ix | 序號,起始爲0 |
in | 序號(天然數範圍),起始爲1 |
if | 類型爲浮點的「序號」 |
x | 座標 |
y | 座標 |
w | 寬度 |
h | 高度 |
vc | 視圖控制器 |
v | 視圖 |
除以上規則約定外,其餘常量約定了如下前綴:
前綴 | 含義 |
---|---|
k | 宏常量 |
CDEN | Core Data entity name |
UDk | User Default key |
KCk | Key Chain key |
APIURL | 接口地址 |
另見:常量管理
圖片資源在放入xcassets中相應視圖控制器文件夾的基礎上,根據[相應的功能] + [Btn | BtnClick | Icon]
,例:
1 |
UserAvatarDefaultIcon |
UpperCamelCase
)lowerCamelCase
)snake_case
)可使用普遍使用的縮寫,如 URL
、JSON
,而且縮寫要大寫。但像將download
簡寫爲dl
這種是不能夠的。
1 |
Objective-C |
i,j專用於循環標號
爲私有方法命名不要直接以「」開頭,而應以「命名空間」開頭。
類方法聲明在方法類型與返回類型之間要有空格。
1 |
Objective-C |
條件判斷的括號內側不該有空格。
1 |
// 糟糕 |
關係運算符(如 >=
、!=
)和邏輯運算符(如 &&
、||
)兩邊要有空格。
1 |
// OK |
二元算數運算符兩側是否加空格不肯定,根據狀況本身定。一元運算符與操做數以前沒有空格。
多個參數逗號後留一個空格(這也符合正常的西文語法)。
方法的花括號推薦另起一行。方法內部須要寫在一行。
1 |
- (void)methodName:(NSString *)string { |
動機
Xcode 默認的花括號位置是這樣的:方法內部的各類補全都是在同一行的;方法定義的比較混亂,默認模版另起一行,但從 Interface Builder 中連線生成的方法在同一行的。
考慮到 Xcode 的默認行爲,方法內部要另起一行,方法所在行不強制定死。另外,模版能夠定製,而 IB 生成的代碼不可定製,因此不另起一行的寫法優先。
另起一行的寫法在代碼摺疊後很是難看。
相對獨立的程序塊之間、變量說明以後必須加空行。
與多數其餘規範不一樣,不建議手動折行。
動機
手動折行的效果嚴重寬度依賴於窗口寬度——窗口過寬浪費寶貴的屏幕空間,較窄時可能沒法閱讀。並且 Xcode 自動折行的效果仍是不錯的。
儘早返回錯誤:
1 |
// 爲了簡化示例,沒有錯誤處理,並使用了僞代碼 |
禁止在類的 interface 中定義任何 iVar 成員,只容許使用屬性,但能夠在特定情形中使用屬性生成的 iVar。
儘可能老是使用點操做符訪問屬性,而不是屬性生成的 iVar 變量。如下情形除外:
動機
若是使用 iVar,不少狀況要特殊處理,容易出錯。老是使用成員,規則簡單,不易出問題。
直接訪問 iVar 的 block 會 retain iVar 所屬的對象,這點很容易被忽略
定義和使用 iVar 都會產生編譯警告,只不過默認設置沒啓用這兩個警告
何時使用 copy?
相關 Demo 可在 https://github.com/BB9z/PropertyTest 得到。
除非調試用的、控制不一樣編譯模式行爲的常量可用宏外,其餘常量不得用宏定義。
常量定義示例:
1 |
// 頭文件 |
使用Xcode插件VVDocumenter-Xcode能夠有效的進行編寫註釋的需求
全部的.h文件中對外的接口方法定義中必須進行註釋,而.m文件中除非已經在.h中已經註釋的方法或者是get/set方法能夠不註釋外,其他函數必須進行註釋。
修改代碼同時修改相應的註釋,以保證註釋與代碼的一致性。再也不有用的註釋要刪除。
最後一點,儘可能讓代碼能夠自表述,而不是依賴註釋。
註釋應該表達那些代碼沒有表達以及沒法表達的東西。若是一段註釋被用於解釋一些本應該由這段代碼本身表達的東西,咱們就應該將這段註釋當作一個改變代碼結構或編碼慣例直至代碼能夠自我表達的信號。咱們重命名那些糟糕的方法和類名,而不是去修補。咱們選擇將長函數中的一些代碼段抽取出來造成一些小函數,這些小函數的名字能夠表述原代碼段的意圖,而不是對這些代碼段進行註釋。儘量的經過代碼進行表達。你經過代碼所能表達的和你想要表達的全部事情之間的差額將爲註釋提供了一個合理的候選使用場合。對那些代碼沒法表達的東西進行註釋,而不要僅簡單地註釋那些代碼沒有表達的東西。」[^2]
方法內部禁止使用塊註釋。除非要臨時註釋大段代碼,通常狀況總應使用行註釋。
動機
由於塊註釋不能正確嵌套。