Xcode工程
1.物理文件應(yīng)該與Xcode工程文件保持同步來避免文件擴張浑塞。 即Xcode下的Group應(yīng)存在對應(yīng)的文件夾炫乓。代碼不僅是根據(jù)類型來分組压鉴,而且還可以根據(jù)功能來分組柿汛,這樣代碼更加清晰胸嘴。
2.代碼行最多應(yīng)不超過80列
3.縮進統(tǒng)一使用4空格
代碼組織
在函數(shù)分組和protocol/delegate實現(xiàn)中使用#pragma mark -
來分類方法。主要有:
#pragma mark - Lifecycle
- (instancetype)init{}
- (void)dealloc{}
- (void)viewDidLoad{}
- (void)viewWillAppear:(BOOL)animated{}
- (void)didReceiveMemoryWarning{}
#pragma mark - IBActions
- (IBAction)submitData:(id)sender{}
#pragma mark - Public
- (void)publicMethod{}
#pragma mark - Private
- (void)privateMethod {}
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
Class
類的命名應(yīng)使用大駝峰命名法則, 如:HomePageViewController.h
雖然官方推薦通用的類需要添加前綴,而只在應(yīng)用使用的類則不需要使用前綴, 但是為了項目的統(tǒng)一風格, 或者在#import的時候?qū)㈨椖績?nèi)的類跟第三方, 系統(tǒng)的類區(qū)分開, 此處應(yīng)都添加前綴(前綴應(yīng)是本項目的2-3個大寫字母)
UIApplication
AFNetworking
MKMessageViewController
錯誤示例
Application
afNetworking
MessageViewController
Category
Category的命名應(yīng)使用前綴+擴展類名+功能描述次, 例如要擴展一個基于NSString的解析類, 文件應(yīng)命名成UIColor+MCStyle.h, Category的本身命名可以書寫成
@interface UIColor (MCStyle)
@end
Methods
書寫規(guī)范
首先 +/- 后緊跟一個空格與返回值分開,參數(shù)類型跟*也要用空格分開,如下,
方法大括號和其他大括號(if/else/switch/while 等.)總是在同一行語句打開但在新行中關(guān)閉寄锐。
- (void)setExampleText:(NSString *)text image:(UIImage *)image{
// doSomething
}
if (user.isHappy) {
//Do something
} else {
//Do something else
}
錯誤示例:
if (user.isHappy)
{
//Do something
}
else {
//Do something else
}
命名規(guī)范
- 方法命名一般規(guī)則由動詞+名詞組成, 應(yīng)該要書寫完整單詞, 不使用縮寫, 但是and應(yīng)盡量不用于連接參數(shù), 要達到執(zhí)行方法就像是在讀語句
- (void)invokeWithTarget:(id)target;
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
錯誤示例:
- (void)invokeWith:(id)target;
- (void)setExampleText:(NSString *)text i:(UIImage *)image;
- get/set方法, get方法應(yīng)該直接使用屬性名, 而不要添加get前綴, BOOL返回值狀態(tài)類型應(yīng)該使用is前綴命名, 而且其他形容詞方法則可以使用can, should等詞
- (CGSize)cellSize;
- (BOOL)isEditing;
- (void)setEditing:(BOOL)flag;
- (BOOL)canHide;
- (void)setCanHide:(BOOL)flag;
錯誤示例:
- (CGSize)getCellSize;
- (NSSize)getEditing;
- (void)changeEditing:(BOOL)flag;
- (BOOL)hide;
- (void)canHide:(BOOL)flag;
方法調(diào)用
- 若是一行能書寫完整方法, 當然是最好, 單很多情況下OC因為命名規(guī)則, 多參數(shù)等原因, 方法調(diào)用很容易超過一行80列, 這時候應(yīng)該選擇換行并對齊參數(shù)
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval {
...
}
而不能
[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];
Properties
書寫規(guī)范
- @property后應(yīng)緊跟空格將屬性特性分割開來, 屬性特性應(yīng)按照IBOutlet的特性聲明順序, 即storage兵多、atomicity, 類型與變量名之間應(yīng)用空格分開, 引用類型的 * 應(yīng)挨著變量名
@property (copy, nonatomic) NSString *title;
錯誤示例
@property(copy, nonatomic) NSString *title;
@property (nonatomic, copy) NSString *title;
@property(copy, nonatomic) NSString*title;
此處注意, NSString應(yīng)用copy聲明而不是retain或者strong, 因為可能會出現(xiàn)誤傳NSMutableString導(dǎo)致值會被更新
命名規(guī)范
變量命名應(yīng)遵循小駝峰命名方法, 并書寫完整單詞, IBOutlet類型變量則應(yīng)包含完整控件內(nèi)容
@property (copy, nonatomic) NSString *title;
@property (strong, nonatomic) UIImage *image;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
錯誤示例
@property (copy, nonatomic) NSString *tle;
@property (strong, nonatomic) UIImage *img;
@property (weak, nonatomic) IBOutlet UILabel *name;
屬性的訪問應(yīng)使用點, 而不是[]
[UIApplication sharedApplication].delegate
self.array.count
錯誤示例
[[UIApplication sharedApplication] delegate]
[self.array count]
若你不確認要獲取的值是不是屬性, 請用command+鼠標左鍵點擊進去看
屬性的使用方式
為保證代碼的一致性盡可能使用私有屬性, 而不是實例屬性
@interface MKUtil : NSObject
@property (strong, nonatomic) NSString *utilName;
@end
錯誤示例
@interface MKUtil : NSObject {
NSString *utilName;
}
私有屬性的訪問應(yīng)該統(tǒng)一使用self.xxx來訪問, 而不是直接訪問_xxx, self.xxx才會調(diào)用get方法來獲取值, 統(tǒng)一出口才能避免產(chǎn)生不必要的錯誤
self.tableView.tableFooterView
錯誤示例
_tableView.tableFooterView
常量
- 類內(nèi)部使用的常量應(yīng)使用static進行聲明, 而不是#define, 常量的命名遵循大駝峰命名, 需要前綴+具體存在的類+實際含義
static NSString * const HomePageViewControllerWebsite = @"[www.baidu.com";](http://www.baidu.com/)
static CGFloat const HomePageImageThumbnailHeight = 50.0;
錯誤示例
#define Website @"[www.baidu.com](http://www.baidu.com/)"
#define thumbnailHeight 2
- 全局使用的常量則應(yīng)該使用extern進行聲明, 如notification
extern NSString * const NSApplicationDidBecomeActiveNotification
注意notification聲明的常量一定有notification結(jié)尾, 還是那句讀完名字就能馬上知道這變量, 方法是做什么的, 代碼自注釋
枚舉
枚舉的聲明應(yīng)使用NS_ENUM語法, 而不enum, 命名規(guī)則依舊是大駝峰(這里命名我覺得也可以有下劃線), 由枚舉類型+具體類型單詞組成,可以顯式的賦值
typedef NS_ENUM(NSInteger, NSTextAlignment) {
NSTextAlignmentLeft = 1,
NSTextAlignmentCenter = 2,
NSTextAlignmentRight = 3,
NSTextAlignmentJustified = 4,
NSTextAlignmentNatural = 5,
};
其他
BOOL
- BOOL值變量應(yīng)該只是用YES跟NO. 因為true和false應(yīng)該只在CoreFoundation,C或C++代碼使用.BOOL變量應(yīng)該直接用于判斷, 而不能用于跟YES或者NO比較, 因為BOOL被設(shè)定為8位
BOOL status = YES;
if (status){
// doSomething
}
錯誤示例
BOOL status = YES;
if (status == YES){
// doSomething
}
- 如果BOOL屬性的名字是一個形容詞橄仆,屬性就能忽略"is"前綴剩膘,但要指定get訪問器的慣用名稱。例如:
@property (assign, getter=isEditable) BOOL editable;
單例
單例應(yīng)該使用標準Objective-C語法創(chuàng)建
+ (instancetype)sharedInstance {
static id sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}