對于我而言酱讶,為數不多取悅自己的方式就是袜瞬,發(fā)現一片新的大陸磕潮,或者將自己的屋子收拾成自己想要的樣子。
controller代碼分組
在函數分組和protocol/delegate實現中使用#pragma mark -來分類方法棺聊,要遵循以下一般結構:
#pragma mark - Lifecycle
- (instancetype)init {}
- (void)viewDidLoad {}? viewDidLoad中做三件事情,一件是addSubView贞谓,一件是添加約束initConstraints,一件是初始化數據initDefaultData
-?(void)viewWillAppear:(BOOL)animated?{}
- (void)dealloc {}
-?(void)didReceiveMemoryWarning?{}
#pragma mark - Public
- (void)ClassPublicMethod {}? 用類名開頭
#pragma mark - Private
- (void)privateMethod {}? 直接用功能命名方法
#pragma mark - event response
按鈕點擊限佩,touchBegan等方法
#pragma mark - 系統delegate
#pragma mark - UITextFieldDelegate
#pragma?mark?-?UITableViewDataSource
#pragma?mark?-?UITableViewDelegate
#pragma mark - UIScrollViewDelegate等。
#pragma mark - 自定義delegate
#pragma mark - Private set/get
所有的view都寫成屬性裸弦,用懶加載的形式進行創(chuàng)建祟同。然后只有在添加到父視圖的時候,用self.view的形式表示理疙,代表創(chuàng)建晕城,其他情況下用_view,省去走懶加載的方法
其他規(guī)范
1窖贤、方法大括號和其他大括號(if/else/switch/while 等.)總是在同一行語句打開但在新行中關閉
應該:
if(bool) {
}
不應該:
if(bool)
{
}
2砖顷、私有變量應該盡可能代替實例變量的使用。盡管使用實例變量是一種有效的方式赃梧,但更偏向于使用屬性來保持代碼一致性择吊。
應該:
@interface ZYObject : NSObject
@property?(strong,?nonatomic)?NSString?*text;
@end
不應該:
@interface ZYObject : NSObject{
???? NSString *text;
}
3、所有屬性特性應該顯式地列出來槽奕,有助于新手閱讀代碼几睛。屬性特性的順序應該是storage、atomicity粤攒。
應該:
@property (strong, nonatomic) NSString *name;
不應該:
@property (nonatomic, strong) NSString *name;
4所森、盡量多使用點語法,而不是用[]的方式去調用,提高代碼的簡潔性
應該:array.count????? 不應該:[array count]
5夯接、一個類中的常量建議用const關鍵字焕济,全局常量建議用#define,他們的區(qū)別如下:
const定義的只讀變量在程序運行過程中只有一份拷貝(因為它是全局的只讀變量盔几,存放在靜態(tài)區(qū))晴弃,而#define定義的宏常量在內存中有若干個拷貝。
#define宏是在預編譯階段進行替換,而const修飾的只讀變量是在編譯的時候確定其值上鞠。
#define宏沒有類型际邻,而const修飾的只讀變量具有特定的類型
注:const只能修飾常量或者常量等式
6、命名規(guī)范:(可讀性高芍阎,防止沖突)不同類中的公有方法和公有屬性加前綴世曾,如相冊類用PG開頭;常量的命名用K開頭作為標記谴咸;枚舉和delegate方法名都要以類名開頭轮听,delegate的方法要將調用者自己寫在方法的參數中
例如:枚舉
typedef NS_ENUM(NSInteger, ZYControllerType) {
??? ZYControllerTypeOne,
??? ZYControllerTypeTwo,
??? ZYControllerTypeThree
};
7、如果BOOL屬性的名字是一個形容詞岭佳,屬性就能忽略"is"前綴血巍,但要指定get訪問器的慣用名稱,例如:
@property (assign, getter=isEditable)BOOLeditable;
8珊随、當訪問CGRect里的x, y, width, 或 height時藻茂,應該使用CGGeometry函數而不是直接通過結構體來訪問。
應該:
CGRect frame = self.view.frame;
CGFloat?x?=?CGRectGetMinX(frame);
CGFloat?y?=?CGRectGetMinY(frame);
CGFloat?width?=?CGRectGetWidth(frame);
CGFloat?height?=?CGRectGetHeight(frame);
CGRect?frame?=?CGRectMake(0.0,?0.0,?width,?height);
不應該:
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;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };
9玫恳、當使用條件語句編碼時辨赐,左手邊的代碼應該是"golden" 或 "happy"路徑。也就是不要嵌套if語句京办,多個返回語句也是OK掀序。
應該:
- (void)someMethod {
??? if(![someOther?boolValue])?{
??????? return;
??? }
??? doSomething
}
不應該:
- (void)someMethod {
??? if([someOther?boolValue])?{
? ? ? ? doSomething;
??? }
}
10、當方法通過引用來返回一個錯誤參數惭婿,判斷返回值而不是錯誤變量不恭。
應該:
NSError *error;
BOOL isSuccess = [self trySomethingWithError:&error];
if (!isSuccess) {
??? // Handle Error
}
不應該:
NSError *error;
BOOL isSuccess = [self trySomethingWithError:&error];
if (error) {
??? // Handle Error
}
11、創(chuàng)建view的正確姿勢
i:重寫init方法财饥,并在其中addsubview
ii:重寫layoutSubviews方法换吧,并在其中添加約束
iii:? 需要動態(tài)計算長度的,單行用sizeWithAttributes钥星,多行用boundingRectWithSize