下面说下 iOS 的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下。
相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个 VC 里有 3 个按钮被命名为 button1、button2、button3,全文没有注释,去看代码逻辑才能知道这三个按钮的意思,我也是醉了!
下面的规范 有的定的比较死,大家可以根据自己团队的风格进行修改。该文章主要是 OC 的代码规范,有几个是 Swift 的规范。
OC 和 Swift 的代码规范如下:
1、 注意
#pragma mark -(加横线)是用来 区分大模块的,首字母要大写。
#pragma mark(不加横线)是标注 小模块的, mark 与函数第一行不要有空行,没有的模块不用写 mark。
2、基本标准
#pragma mark - Life Cycle
viewDidLoad 前的
viewDidLoad
viewDidLoad 后的
dealloc
#pragma mark - (系统提供的 delegate)
#pragma mark - (自定义的 delegate)
#pragma mark - (第三方的 delegate)
#pragma mark - Event response // 这里主要放 IBAction,通知,gesture 等
#pragma mark - Public method
#pragma mark - Private method
#pragma mark - Getters and Setters
3、项目中常用到的
#pragma mark - Life Cycle
#pragma mark - Override
#pragma mark - UITableViewDelegate
#pragma mark - CustomDelegate
#pragma mark - Event Response
#pragma mark - Public Methods
#pragma mark - Getters and Setters
如果退出该页面,没有执行 dealloc 方法,就是存在内存泄露的问题,所以都加上 dealloc 方法,并打印日志。养成习惯。
1、常用的后缀名规则
除了下面几个进行浓缩,其他的只去掉 UI 就可以了(如 UITextField 写成:TextField):
UIButton :Btn
UILabel :Lbl
UITableViewCell :Cell
Image :Img
UIViewController: VC
UITableViewController :TableVC
2、其他
2.1、新建一个 UIViewController 文件 后缀要 ViewController
2.2、新建一个 UITableViewController 文件后缀要 ViewController
2.3、多个 tag :用 枚举 定义, 后缀:Tag
这个规范是为了大家看每个页面,一看就知道那个方法是做什么的,每个团队都应该根据自己的特点来定制。
如果团队中有几个人的命名很不规范(写的方法名都看不懂),就需要按这条进行统一命名。如果团队的成员都能很好的命名 这条就可以省略。
1、初始化所有控件 统一一个方法名:initAllView
2、初始化数据 的方法名:initData
3、请求网络,统一方法名前缀
vc 里 只有一个网络请求::loadNetData
多个 加后缀:load****NetData
4、网络层的类加后缀: ***Request
5、Model 都要加后缀 Model。。
6、点击事件的前缀:tap
1、import 规整顺序, @end 后留 1 个回车位置, @end 前最后一个函数空 1 行
2、先 import 类本身. h 再 <>,之后"",include 写在一起
#import "AppDelegate.h"
#import <arpa/inet.h>
#import "OpenUDID.h"
1、多个协议名称过长不用换行 依靠 xcode 自动伸缩。
2、方法 没有参数或参数在一行,后面括号 不要换行,如:- (id)responseObject {。
方法有多个参数,参数换行,括号换行,如:
- - (AFHTTPRequestOperation *)PUT: (NSString *)URLString
- parameters:(id)parameters
- success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
- failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
- {
- }
1、weak , copy 的使用要多注意, NSArray ,NSdictionary, NSString 属性定义尽量用 copy,这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该 property 也会发生变化。
2、变量先按功能分类摆放再按类型摆放,可考虑右对齐
1、每个 define 按模块分类后, 照字母自然顺序排序
可以多选判断的时候要用下面的格式:
- typedef NS_OPTIONS(NSUInteger, SDwebImageOptions) {
- SDWebImageRetryFailed = 1 << 0,
- SDWebImageLowPriority = 1 << 1,
- SDWebImageCacheMemoryOnly = 1 << 2,
- SDWebImageProgressiveDownload = 1 << 3,
- SDWebImageRefreshCached = 1 << 4,
- SDWebImageAvoidAutoSetImage = 1 << 11
- };
1、 类, 方法命名
类名首字母大写,方法首字母小写,方法中的参数首字母小写,第二个参数名开始不要加 "with", -, + 号后面由一个空格
同时尽量让方法的命名读起来像一句话,能够传达出方法的意思
同时取值方法前不要加前缀 "get"
手势带 "tapGesture"、"tap" 类似的,通知前缀 "notification"、"note" 类似的, 后面不用带_
2、变量命名
意思完整性, 变量的命名 btn, img 类型在特征词最后,如 softBtn, homeVc, redImg
3、图片目录和命名
btn 按钮的图,默认按下高亮为普通状态图片名称最后带上后缀 "_h"
一级目录(功能)_二级目录(是 btn 还是 img)_三级目录(特征), 如 goodlist_btn_greenArrow
1、TODO
临时处理方案或者未做的实现 加 TODO。
2、NSAssert
使用断言 NSAssert 来跟踪异常: NSAssert(theDate != nil, @"Argument must be non-nil");
3、Instruments
检查自己模块的内存、占用时间、CPU、GPU 等使用情况。
1、初始化 "id" 写成 "instancetype"
2、int 用 NSInteger,float 用 CGFloat
3、":" 后别加空格, 函数第一个大括号不要换行
4、static const NSString * kLNasss = @""";
5、只要出现 "," 后面肯定要写一个空格
6、注释灵活处理,复杂方法需要解释清楚
7、无关的方法,变量都放到. m 里
8、尽量别直接使用数字,字符串赋值,除非后面带上说明该值来历
9、 固定 的 字符串、数字 。如果 只有一处用了,就写死。尽量 注释。
如果一个页面用多次,就在这个页面定义 define
如果多个页面 使用(多个地方 需要同时修改) 就定义成常量
10、if else 的问题。
// 这里写整体的注释
- if () {
- } else { //这里写不写都行
- }
虽然局部变量大多数里面的 self 不用 weak 也不会引起循环引用(tableview 展示 cell 的时候例外 cellForRowAtIndexPath),但是还是推荐大家都加上__weak。
先打 diff、再把 diff 提交 reviewboard、 再提交 svn(打标签的时候带 CR:版本)
- /**
- *
- *
- */
这样写可以用快捷键查看注释的内容 ,一般的不用这样写。。
重写 scrollViewDidScroll 方法的页面 ,要在 dealloc 中将 scrollview.delegate = nil 。。否则 点击返回键会崩溃。 iOS 9 修复了 scrollViewDidScroll 崩溃的问题。
因为 Swift 用 NSLog 会记录到系统日志,可以被黑客获取。
用宏定义来屏蔽 release 环境下的 NSLog 日志输出 对 Swfit 是没用的。
来源: