iOS开发规范(Objective-C版)

2017-03-21  本文已影响0人  欧巴刚弄死他
  1. 关于命名
     1> 统一要求
    • 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释
    • 使用全称,不适用缩写
     2> 类的命名
    • 大驼峰式命名:每个单词的首字母都采用大写字母
       例子:MFHomePageViewController
    • 后缀要求
      ViewController: 使用ViewController做后缀
     例子: MFHomePageViewController
    View: 使用View做后缀
    例子: MFAlertView
    UITableCell:使用Cell做后缀
    例子: MFNewsCell
    Protocol: 使用Delegate或者DataSource作为后缀
    例子: UITableViewDelegate
    UI控件依次类推
    3> 方法命名
    • 小驼峰式命名,每一段都以小写字母开头,后面的单词首字母大写
    • 要符合英语语法,使方法名简单干练,便于理解,语义通顺
    正确示例:

define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]

7> Enum
• Enum类型的命名与类的命名规则一致
• Enum中枚举内容的命名需要以该Enum类型名称开头
  例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
8> Delegate命名
• 当另一个对象中可能用到该类的多个实例时,类的实例必须为回调方法的参数之一, 如

  1. 私有方法、属性及变量声明
     1> 声明位置
    在.m文件中最上方。如果需要显示到头文件,可以使用@private进行修饰。
       例子1:

import "ViewController.h"

@interface ViewController ()
// 在这个category(类目)中定义变量和方法
@end

@implementation ViewController {
// 声明私有变量
}
例子2:
@interface ViewController : UIViewController {
@private
NSString *name;
}

  1. 关于注释
     最好的代码是不需要注释的 尽量通过合理的命名
     良好的代码把含义表达清楚 在必要的地方添加注释
     注释需要与代码同步更新
     如果做不到命名尽量的见名知意的话,就可以适当的添加一些注释或者mark
     1> 属性注释和方法声明注释
    使用系统自带的“option+command+/”
    /**
    代理方法

@param personID 登录ID
@param password 密码
@param completeHandler 完成回调
*/

  1. 关于UI布局
     推荐使用纯代码写UI,方便其他人修改和理解。除了UITableViewCell,这个类使用xib具有一定的优势。
     Xib文件的命名与其对应的.h文件保持相同
     Xib文件中控件的组织结构要合理,Xib文件中控件需要有合理的可读性强的命名,方便他人理解
  2. 格式化代码
     1> 指针 "" 位置
      定义一个对象时,指针 "
    " 靠近变量
       例子: NSString *userName;
     2> 方法的声明和定义
    在 - 、+ 和 返回值 之间留一个空格,方法名和第一个参数之间不留空格

3> 代码缩进
• 使用 xcode 默认缩进,即 tab = 4空格
• 使用 xcode 中 re-indent 功能定期对代码格式进行整理
• 相同类型变量声明需要独行声明
例子:
CGFloat oringX = self.view.frame.origin.x;
CGFloat oringY = self.view.frame.origin.y;
CGFloat lineWidth = self.view.frame.size.width;
• Method与Method之间空一行
例子:
@implementation ViewController

pragma mark – 私有方法

pragma mark – 公有方法

pragma mark – 生命周期

warning 待完善

}
• 对于过期的方法、类、结构体和枚举等,使用系统自带的deprecated系列和NS_UNAVAILABLE
方法警告。

  1. 目录格式
    1> 根据项目的功能从大块到小块对文件用不同的文件夹进行分装;
    2> 按照项目的功能进行分类的,文件夹用中文命名;
    3> 按照代码的功能进行分类的,文件夹可以用英文或中文命名;
    4> 第三方库和工具单独存放到一个文件夹;
    5> 根据情况,小尺寸图片统一放到Assets.xcassets,同样用文件夹分类存放;
    6> 其他图片,尤其是大图,要放在boundle里,一般放在“/Resources/图片/”里;
    7> 通用的类,根据视图、模型和控制器的分类用不同文件夹分类存放;
    8> 具体到某一个小模块,则根据MVC对文件进行分类。
  2. git代码管理
    1> 先更新,再提交;
    2> 提交的时候带上自己的名字,干了什么就写什么,不得遗漏;
    3> 有重要的提交,要通知一下其他组员;
    4> git分支用版本号作为后缀。
  3. 其他细节
    1> 在Runtime+KVC面前成员变量没有公私之分,建议全部使用@property声明属性,“私有变量”的放在.m文件中的extension中声明即可,.h文件中公开的属性应合理使用readonly修饰。使用@property还有个优势,方便内存管理,规避循环引用;
    2> 控制器类中的代码尽量不要超过500行,借助继承、多态、封装三大特性和MVC、MVVM思想简化、拆分代码;
    3> 避免使用left、right、123等字样进行View控件命名,以免后续的UI修改导致命名冲突;
    4> 声明UIView及其子类属性尽量用weak修饰;
    5> ARC环境下声明NSArray/NSDictionary/NSString属性,用copy;声明前三者可变子类属性用strong;
    6> 拥有相同功能的类封装成父类;
    7> control+i 组合键,自动对齐;
    8> MJRefresh、AFNetworking在迭代过程中都出现过修改方法名的情况,比较成熟的解决方案是创建桥梁分类,封装常用的方法。如果第三方库出现命名修改,只要修改桥梁分类中的内容即可,不用每个类都去改方法,节省大量时间。这种解耦思想同样适用于NSTimer,能主动解除循环引用。详情见[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自释放定时器];
    9> 尽量不要在预编译头文件里引入太多文件,尽量精简;
    10> 分类(category)根据功能进行分类和命名;
    11> 图片命名根据模块(子模块)功能进行命名;
    12> 注意对象的内存释放问题,防止循环引用。
上一篇 下一篇

猜你喜欢

热点阅读