一个追求极致的人,一定要写出优美的代码.每次回头看自己写代码都觉得看不下去,无法想象那是自己写的代码.不断反思,觉得写代码一直太随意,不应该只一味的追求功能的实现,而忽略了代码的整洁,代码的结构.一个好的结构能够更快的进行版本迭代.严格的要求自己,注重代码质量,不断的修炼自己是当下对我自己的要求,增加自己的代码量,改变自己的思维.
开发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函数
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
Tips7:避免循环引用
如果【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:监听键盘的通知建议:
使用:UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification
而不是,下面代码;因为键盘可能因为改变输入法,切换成表情输入,切换成英文,那么frame可能会变高,变矮,
不一定会发出下面这些通知,但 是肯定会发上面的通知
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提供数据
2. 给ViewController存储数据提供接口
3. 提供经过抽象的业务基本组件,供Controller调度
C应该做的事:
1. 管理View Container的生命周期
2. 负责生成所有的View实例,并放入View Container
3. 监听来自View与业务有关的事件,通过与Model的合作,来完成对应事件的业务。
V应该做的事:
1. 响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在View去做)等。
2. 界面元素表达