代码规范

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`要清晰很多


# 提交代码规范
提交代码时的描述必须写,且简明扼要就可以
## 我们的目标是让每一位小伙伴都能欣赏我们的代码
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,454评论 21 35
  • 代码格式 使用空格而不是制表符 Tab 不要在工程里使用 Tab 键,使用空格来进行缩进。在 Xcode > Pr...
    small_Sun阅读 1,358评论 1 3
  • Objective-C Coding Guidelines In Chinese Objective-C编码规范,...
    爨乡的云阅读 501评论 0 0
  • 概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序。关于Objectiv...
    DreamMmMmM阅读 1,162评论 0 7
  • 概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序。关于Objectiv...
    拾丨玖阅读 816评论 0 0