一個追求極致的人,一定要寫出優(yōu)美的代碼.每次回頭看自己寫代碼都覺得看不下去,無法想象那是自己寫的代碼.不斷反思,覺得寫代碼一直太隨意,不應該只一味的追求功能的實現(xiàn),而忽略了代碼的整潔,代碼的結構.一個好的結構能夠更快的進行版本迭代.嚴格的要求自己,注重代碼質量,不斷的修煉自己是當下對我自己的要求,增加自己的代碼量,改變自己的思維.
開發(fā)Tips
Tips1:我的controller代碼結構
#pragma mark - life cycle
#pragma mark - UITableViewDelegate
#pragma mark - CustomDelegate
#pragma mark - event response
#pragma mark - private methods
#pragma mark - getters and setters
Tips2:
更新UI可以放在viewWilllayoutSubview或者didLayoutSubview里.
Tips3:
巧用屬性的get方法來進行初始化.
Tips4:單例正確姿勢
+ (instancetype)sharedInstance {
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
Tips5:忽略不必要的警告??
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
Tips6:CGRect函數(shù)
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
Tips7:避免循環(huán)引用
如果【block內部】使用【外部聲明的強引用】訪問【對象A】, 那么【block內部】會自動產生一個【強引用】指向【對象A】
如果【block內部】使用【外部聲明的弱引用】訪問【對象A】, 那么【block內部】會自動產生一個【弱引用】指向【對象A】
__weak typeof(self) weakSelf = self;
myObj.myBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething]; // strongSelf != nil
// preemption, strongSelf still not nil(搶占的時候孔轴,strongSelf 還是非 nil 的)
[strongSelf doSomethingElse]; // strongSelf != nil }
else { // Probably nothing... return;
}
};
Tips8:SD,XIB的加載
加載xib,xib名稱用NSStringFromClass(),避免書寫錯誤
Tips9:監(jiān)聽鍵盤的通知建議:
使用:UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification
而不是,下面代碼;因為鍵盤可能因為改變輸入法,切換成表情輸入,切換成英文,那么frame可能會變高,變矮,
不一定會發(fā)出下面這些通知,但 是肯定會發(fā)上面的通知
UIKIT_EXTERN?NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN?NSString *const UIKeyboardDidShowNotification;
UIKIT_EXTERN?NSString *const UIKeyboardWillHideNotification;
UIKIT_EXTERN?NSString *const UIKeyboardDidHideNotification;
Tip10: MVC
M應該做的事:
1. 給ViewController提供數(shù)據
2. 給ViewController存儲數(shù)據提供接口
3. 提供經過抽象的業(yè)務基本組件墩剖,供Controller調度
C應該做的事:
1. 管理View Container的生命周期
2. 負責生成所有的View實例界轩,并放入View Container
3. 監(jiān)聽來自View與業(yè)務有關的事件,通過與Model的合作蚂斤,來完成對應事件的業(yè)務。
V應該做的事:
1. 響應與業(yè)務無關的事件槐沼,并因此引發(fā)動畫效果曙蒸,點擊反饋(如果合適的話,盡量還是放在View去做)等岗钩。
2. 界面元素表達