iOS 代码规范(自个公司)

iOS Objective-C Code Style

前言 : 为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范 .
本期使用MVC框架 , 保持公共API 的简洁性 .

一、命名

1.每行的长度

每行的长度不得超过 120 个字符
设置: “Xcode => Preferences => TextEditing => 勾选 Show Page Guide / 输入100 => OK”


2.关于命名

统一要求 : 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 .
          按照驼峰式命名法则:(大驼峰:每个单词首字母都大写--小驼峰:第一个单子首字母小写,其余都大写)
         类名首字母大写,方法首字母小写,方法中的参数首字母小写,长度无限制.
         尽量方法名读起来一句话
         变量名的大小在2-20个字母之间,避免单字母变量.


1>property变量


@property (nonatomic, strong) NSMutableArray *驼峰命名规则:
                                                指针*要靠近变量名
                                                前部分参数用途: path 
                                                后部分参数类型: muArr
                                                最后: 注释(若后期维护新添加或删除的变量-加自个名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可变数组用来储存路径- LYG 

缩写规则:
        (如:表)

字符串
NSString
str
可变字符串
NSMutableString
muStr
字典
NSDictionary
dic
可变字典
NSMutableDictionary
muDic
数组
NSArray
arr
可变数组
NSMutableArray
muArr
数据
NSData
data
可变数组
NSMutableData
muData
标签
UILabel
label
按钮
UIButton
btn
图片
UIImage
img
图片视图
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

⁃   全部大写,单词用_进行分割(不带参数)
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

⁃   以字母 k 开头,后面要遵循大驼峰命名规则(不带参数)
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

⁃   小驼峰命名(带参数)
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚举 Eeum

⁃   枚举命名和类的命名一样
⁃   枚举中的内容命名需要以改枚举类型名称开头

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作为后缀

⁃   类的实例必须为回调方法的参数之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


⁃   回调方法的参数只有类自己的情况,方法名要符合实际含义(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


⁃   以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


类型标示符、代理名称、尖括号间不留空格
该规则同样适用于:类声明、实例变量和方法声明 
 每一个delegate都把对应的protocol名字带上,delegate方法不要乱写,写到一块区域里面去

@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> _delegate;
}

  • (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
    如果类声明中包含多个protocal,每个protocal占用一行,缩进4个字符。
    如:
    @interface CustomViewController : ViewController<
    AbcDelegate,
    DefDelegate

{
... }

5>block

使用Block时,内容四个空格缩进,“^”后带有参数时,参数与“{”之间有一个空格缩进
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的声明和定义

⁃   在 - OR + 和返回值之间留 1 个空格,方法名和第一个参数间不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ⁃ 当参数过长时,每个参数占用一行,以冒号对齐
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ⁃ 如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ⁃ Method与Method之间空一行(官方规定左括号应另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 标注一类函数,便于查找

iOS Objective-C Code Style

前言 : 为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范 .
本期使用MVC框架 , 保持公共API 的简洁性 .

一、命名

1.每行的长度

每行的长度不得超过 120 个字符
设置: “Xcode => Preferences => TextEditing => 勾选 Show Page Guide / 输入100 => OK”


2.关于命名

统一要求 : 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 .
          按照驼峰式命名法则:(大驼峰:每个单词首字母都大写--小驼峰:第一个单子首字母小写,其余都大写)
         类名首字母大写,方法首字母小写,方法中的参数首字母小写,长度无限制.
         尽量方法名读起来一句话
         变量名的大小在2-20个字母之间,避免单字母变量.


1>property变量


@property (nonatomic, strong) NSMutableArray *驼峰命名规则:
                                                指针*要靠近变量名
                                                前部分参数用途: path 
                                                后部分参数类型: muArr
                                                最后: 注释(若后期维护新添加或删除的变量-加自个名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可变数组用来储存路径- LYG 

缩写规则:
        (如:表)

字符串
NSString
str
可变字符串
NSMutableString
muStr
字典
NSDictionary
dic
可变字典
NSMutableDictionary
muDic
数组
NSArray
arr
可变数组
NSMutableArray
muArr
数据
NSData
data
可变数组
NSMutableData
muData
标签
UILabel
label
按钮
UIButton
btn
图片
UIImage
img
图片视图
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

⁃   全部大写,单词用_进行分割(不带参数)
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

⁃   以字母 k 开头,后面要遵循大驼峰命名规则(不带参数)
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

⁃   小驼峰命名(带参数)
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚举 Eeum

⁃   枚举命名和类的命名一样
⁃   枚举中的内容命名需要以改枚举类型名称开头

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作为后缀

⁃   类的实例必须为回调方法的参数之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


⁃   回调方法的参数只有类自己的情况,方法名要符合实际含义(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


⁃   以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


类型标示符、代理名称、尖括号间不留空格
该规则同样适用于:类声明、实例变量和方法声明每一个delegate都把对应的protocol名字带上,delegate方法不要乱写,写到一块区域里面去
@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
 id<MyFancyDelegate> _delegate;
 }
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
如果类声明中包含多个protocal,每个protocal占用一行,缩进4个字符。 
如: 
 @interface CustomViewController : ViewController<
   AbcDelegate,
   DefDelegate
{ 
... } 

5>block

使用Block时,内容四个空格缩进,“^”后带有参数时,参数与“{”之间有一个空格缩进
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的声明和定义

⁃   在 - OR + 和返回值之间留 1 个空格,方法名和第一个参数间不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ⁃ 当参数过长时,每个参数占用一行,以冒号对齐
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ⁃ 如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ⁃ Method与Method之间空一行(官方规定左括号应另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 标注一类函数,便于查找


    8>注释问题

▪   .h和.m 文件注释:

/* 登陆页面主页 ***********************************************************************************************************

  • 类名* 建立日期* 版权声明作者模块描述----------------------------------------------------------------* 修改历史* 序号 日期 修改人 修改原因12 **********************************************************************************************************
    */
▪   类和对象方法注释:

1 /**
2   * @brief 登录验证
3   *
4   * @param personId 用户名
5   * @param password 密码
6   * @param complete 执行完毕的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

▪   声明注释

@property (nonatomic, strong) Student *student; //进行单行注释
采用//进行单行注释。所有逻辑判断需要添加注释说明。所有变量、常量需要添加注释说明

对 nil 的检查
▪ 仅在有业务逻辑需求时检查 nil,而非为了防止崩溃▪ 向 nil 发送消息不会导致系统崩溃,Objective-C 运行时负责处理

对 BOOL 陷阱
▪ 禁止将int直接转换(cast or convert)为BOOL 。Objective-C中,BOOL 被定义为 unsigned char,这意味着除了 YES (1) 和 NO (0)外它还可以是其他 值。▪ 将整型值转换为 BOOL 的方法:使用三元运算符返回 YES / NO,或使用位运算符 (&&, ||, !)。
▪ 禁止将数组的大小、指针值或位运算符的结果转换(cast or convert)为 BOOL,因为该 BOOL 值的结果取决于整型值的最后一位。▪ 在Objective-C中,只允许使用BOOL▪ 如:
// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推荐- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
▪ 禁止直接将 BOOL 和 YES/NO 比较,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推荐
BOOL great = [foo isGreat];
if (great)
...

 常用的快捷方式
    command+r 运行
    command+. 停止 死循环中用到
    command+b 编译 编译程序不运行
    command+z 回退
    command+shift+z 前进
    command+a 全选
    command+c v x  复制 粘贴 剪贴
    command+tab 不同程序之间的切换
    command+ ~ 相同程序之间切换
    command+q 退出
    command + shift + J 快速定位当前所在文件位置

更多快捷键: http://www.cocoachina.com/ios/20160822/17393.html

iOS团队要求

1 删除多余的空行 * 所有方法与方法之间空1行 * 所有代码块之间空1行
2 删除多余的注释 * 删除注释掉的代码 * 删除没有意义的注释
3 删除多余的方法 * 如果方法没有使用到,请删除它 * 如果方法没有执行任何业务逻辑,请删除它或者给出一定注释
4 删除未被使用的资源文件
5 添加必要的注释 * 所有 .h 文件中的property 需要给出注释 * 所有自定义的方法需要给出注释 * 比较大的代码块需要给出注释 * 所有代码中出现的阿拉伯数字需要给出注释 * 程序中出现加密/解密 逻辑的操作地方,需要给出注释说明过程(无论是系统还是自定义)
6 整体代码风格需要统一 * 代码后面的”{“ 不需要单独占用一行 * 逻辑运算符 与 代码之间空一格 * “#pragma mark -” 与下面的代码之前不要空行 * 遵循一般性的代码规范

写代码规范35条小建议: http://www.jianshu.com/p/71fdd1ae714c

    8>注释问题

▪   .h和.m 文件注释:

/* 登陆页面主页 ***********************************************************************************************************

  • 类名* 建立日期* 版权声明作者模块描述----------------------------------------------------------------* 修改历史* 序号 日期 修改人 修改原因12 **********************************************************************************************************
    */
▪   类和对象方法注释:

1 /**
2   * @brief 登录验证
3   *
4   * @param personId 用户名
5   * @param password 密码
6   * @param complete 执行完毕的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

    ▪   声明注释
`
@property (nonatomic, strong) Student *student; //进行单行注释`
采用//进行单行注释。所有逻辑判断需要添加注释说明。所有变量、常量需要添加注释说明


对 nil 的检查 
▪ 仅在有业务逻辑需求时检查 nil,而非为了防止崩溃▪ 向 nil 发送消息不会导致系统崩溃,Objective-C 运行时负责处理 


对 BOOL 陷阱 
▪ 禁止将int直接转换(cast or convert)为BOOL 。Objective-C中,BOOL 被定义为 unsigned char,这意味着除了 YES (1) 和 NO (0)外它还可以是其他 值。▪ 将整型值转换为 BOOL 的方法:使用三元运算符返回 YES / NO,或使用位运算符 (&&, ||, !)。 
▪ 禁止将数组的大小、指针值或位运算符的结果转换(cast or convert)为 BOOL,因为该 BOOL 值的结果取决于整型值的最后一位。▪ 在Objective-C中,只允许使用BOOL▪ 如: 

// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推荐- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
▪ 禁止直接将 BOOL 和 YES/NO 比较,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推荐
BOOL great = [foo isGreat];
if (great)
...




     常用的快捷方式
        command+r 运行
        command+. 停止 死循环中用到
        command+b 编译 编译程序不运行
        command+z 回退
        command+shift+z 前进
        command+a 全选
        command+c v x  复制 粘贴 剪贴
        command+tab 不同程序之间的切换
        command+ ~ 相同程序之间切换
        command+q 退出
        command + shift + J 快速定位当前所在文件位置

[更多快捷键](http://www.cocoachina.com/ios/20160822/17393.htm)



----


iOS团队要求

1 删除多余的空行     * 所有方法与方法之间空1行     * 所有代码块之间空1行
2 删除多余的注释    * 删除注释掉的代码     * 删除没有意义的注释
3 删除多余的方法     * 如果方法没有使用到,请删除它     * 如果方法没有执行任何业务逻辑,请删除它或者给出一定注释
4 删除未被使用的资源文件
5 添加必要的注释     * 所有 .h 文件中的property 需要给出注释     * 所有自定义的方法需要给出注释     * 比较大的代码块需要给出注释     * 所有代码中出现的阿拉伯数字需要给出注释     * 程序中出现加密/解密 逻辑的操作地方,需要给出注释说明过程(无论是系统还是自定义)
6 整体代码风格需要统一     * 代码后面的”{“ 不需要单独占用一行     * 逻辑运算符 与 代码之间空一格     * “#pragma mark -” 与下面的代码之前不要空行     * 遵循一般性的代码规范


[写代码规范35条小建议](http://www.jianshu.com/p/71fdd1ae714c)

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

推荐阅读更多精彩内容