iOS编码规范
命名
变量命名
首字母小写,驼峰法则
UI控件(描述+控件类型)priceLabel或priceLab
注释也要写 最好对齐
@property (nonatomic, strong) UIButton *collectsImgView; //合集 - 图标
@property (nonatomic, strong) UILabel *collectsThemeLab; //合集 - 主题
@property (nonatomic, strong) UILabel *collectsAuthorLab; //合集 - 作者
方法命名
首字母小写,驼峰法则
public method
规则: 方法用途单词_方法
一般的方法 - (void)show_editBtnOnOneViewC:(OneViewC *)oneViewC editBtn:(UIButton *)editBtn.....
跳转 push_
更新数据 update_collectList
删除数据 delete_collectList
private method
规则:不加下划线 不需要and: nameStr:(NSstring)nameStr
- (void)pushOnewViewC:(OnewViewC *)onewViewC
- nameStr:(NSstring)nameStr {}
扩展或封装方法
规则:以FF或ff开头 FanFan简写
- (void)ff_editOnOneViewC:(oneViewC)oneViewC
isOpen:(BOOL) isOpen
少用#define
预处理指令,多用类型常量
预处理指令命名 (字母全大写,以"_"分割)
#define NSString * APP_ROOT_DIR @"xxx"
常量命名 (字母全大写,"k"开头)
static NSString * const kAPPROOTDIR = @"xxx";
资源文件中变量命名
全小写,""分割
模块: 开发功能模块外 nav tab login refresh share hud common(公有)
格式:“模块类别状态描述” 状态可不要
目前版本我们以模块作为文件夹 ,后面的按照这个4个
personal_btn_un_select.png
personal_btn_name_png
nav_btn_left.png
nav_imgView_lright.png
tab_item_un_select.png
tab_item_select.png
能用糖衣语法的尽量用糖衣语法,使用时注意nil
报错。
NSMutableArray = @[].mutableCopy;
NSString *name = dic[@"name"];
NSArray *array= @[item1, item2];
用前缀避免命名空间冲突。大多数的自定制,都需要用前缀
比如创建有读界面
Have (文件夹)
ViewC(文件夹)
HaveReadViewC.h
View
HaveReadView.h
Model
HaveReadModel.h
Cell
HaveReadCell.h
委托Delegate的定义和使用
放在对应类的.h
文件中,
命名为该类名+Delegate,
//定义代理
HaveReadViewCDelegate ==>HaveReadViewC + Delegate
HaveReadCellDelegate ==> HaveReadCell + Delegate
//声明
@property (nonatomic, weak) id <ArticleHeadTableUrlDelegate> delegate;
//必须加判断!!!
if (_delegate && [_delegate respondsToSelector:@selector(push_safariWithUrl:)]) {
[_delegate pushSafariWithUrl:XXXXX];
}
```
## 注释
### 使用清晰而协调的命名方式+适当注释
```
/**
* @beif: 执行push操作 ( 简单明了就可以)
*
* @prama: namestr 名称
* @prama: isOpen 是否打开 0 = 关闭 1= 打开
*
* @discussion: 注意这个方法子啊使用时候XXXXXXXX 等等
*
*
*/
```
### viewC里区块划分
>h文件顶部:类的作用 类的注意一些内容
>
```
/**
订阅合集 分2种
我的订阅 xxxx
他的订阅 xxx
*/
```
>代理
```objectivec
@protocol XXXXXDelegate <NSObject>
@required
@optional
- (void)delete_nameOnOne:(类 *)one nameStr:(NSString *) nameStr ....
```
>代码结构
```objectivec
//#pragma ------------------ LifeCycle生命周期 -----------------
//#pragma ------------------ Setter
- (void)setNameLab:(UILable *)nameLab
{
_nameLab = nameLab;
}
//#pragma ------------------ Getter
- (UIButton *)nameBtn:(UIButton *) nameBtn
{
if(!_ nameBtn){
nameBtn = ...
[self addSubView: nameBtn];
}
return nameBtn;
}
//#pragma ------------------ Layout ------------------
//#pragma - nameBtn
//#pragma - nameBtn - action
//布局
- (void)layoutSubviews;
//#pragma ------------------ Plubic Method ------------------
- (void)update_newViewC....
- (BOOL)delete_editBtn.....
//#pragma ------------------ private Method ------------------
- (void)updateNewViewC....
- (BOOL)deleteEditBtn.....
//#pragma mark ------------- API ------------------
//#pragma mark ------------- 代理
//#pragma ------------------ Cell ------------------
/**
* @brief: 设置cell
*
* @prama: tableView
* @prama: model
* @prama: indexPath
*
*/
+( PersonalSubscribeCell *)show_cellOfTableView:(UITableView *)tableView
model:(PersonalSubscribeModel *)model
indexPath:(NSIndexPath *)indexPath
```
# 编程习惯
>一个原则:能不做的事情,尽量不做,尽量少唤醒CPU,绝不能在UI线程中做耗时操作(如网络请求,数据库读写,文件读写等)
## `Copy`、`mutableCopy`要注意其关联的元素是否支持
## for循环
>不要在循环中创建引用类型变量
>for循环中,用局部变量替代“array.count”
## @autoreleasepool
```objectivec
@autoreleasepool{
for(){
@autoreleasepool{}
}
}
```
## 引用变量声明放在循环外面,可以避免在栈内存中创建过多引用变量
```objectivec
UserInfo userInfo;
// 避免循环中每次都要调用userList.count取值
int size = userList.count;
for (int i = 0; i < size; i++) {
userInfo = userList[i];
// do something...
}
// 推荐
for (int i = 0, max = userList.count; i < max; i++) {
userInfo = userList[i];
// do something...
}
```
## NSString
> 在不需要外部任意修改的情况下,全部用`Copy`
## Block
>`Block`内部需要使用外部类变量的时候,防止循环引用
>切忌在block体中使用`_name`这样的变量,请使用`self.name`
# otehr
>由于Objective-C是类型不安全的,注意加强`类型判断`、`数据越界判断`等等
> 原则上不建议拷贝代码,同一段代码拷贝3次,必须抽离出一个方法,统一调用
>所有的系统的宏,都不得在任意地方乱定义,统一在`FFConfig`文件夹下的头文件中定义,并写好注释
>ViewController中的代码要分结构,多用`#pragma mark - Life Circle`对代码进行分区,ViewController中的代码分区可分为`Life Circle`、`Request`、`Private`、`Delegate`、`Lazy`等等
>ViewController中的代码尽量不要超过`500`行,注意优化
# API
> 一级界面,API考虑离线缓存
>如果你用一句话无法将一个方法的内容表述清楚的话,这往往就意味着`API`的名字需要改进了;例如:`removeAtPoint:`就会比`remove`要清晰很多
# 提交代码规范
提交代码时的描述必须写,且简明扼要就可以
## 我们的目标是让每一位小伙伴都能欣赏我们的代码