每个项目加上前缀如:MF
类名(标识符应当直观且可以拼读,可望文知意,英文单词一般不要太复杂,用词应当准确)
1: 大驼峰命名,每个单词首字母大写
ViewController: 例如 MFLoginVC
UITableViewCell: 例如 MFLoginCell
UICollectionViewCell: 例如:MFLoginCollectionViewCell
View : 例如 MFLoginView
Model : 例如 MFLoginModel
2: 图片命名
不能有中文、大写(兼容安卓)、特殊符号、空白
建议命名方式 模块 _ 界面 _ 名称 _ 状态@nX.png
home_login_pause_selected@2x.png ;
home_login_pause_select@3x.png
3:分类的命名
UIButton+Enlarge.h
NSObject+SafeSwizzle.h
4: 整理项目请求域名,用.plist,配置不同环境的域名保存起来,上线检查plist就行
5. 文件最前面的注释,是保留了工程自动生成的注释,但是需要进行如下修改:文件作者改为个人的名字,公司名为MF software Ltd. 如:
// ViewController.m
// MFLoginVC
// Created by Zhengcx on 2021-03-15.
// Copyright (c) 2021年MF Software Ltd. All rights reserved.
6: If、else、else if、for、while、do等语句自占一行,执行语句不得紧跟其后,不论执行语句有多少都要加{}。
“{”前面添加一个空格,紧跟语句后。方法(函数)时,“{”另起一行并独 占一行书写。
if ( numberA > numberB ) {
return numberA;
}
7: 源代码中关系较为紧密的代码应尽可能相邻
CGFloat fWidth;
CGFloat fLength;
CGFloat fHeight;
8. 类方法添加顺序 (void)viewDidLoad
pragma mark - Life Cycle 添加生命周期的方法
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)didReceiveMemoryWarning
- (void)dealloc
9. 在switch语句中,每一个case分支必须使用break结尾,最后一个分支必须是default分支。
避免漏掉break语句造成程序错误,同时保持程序简洁。对于多个分支相同处理的情况可以共用一个break,但是要用注释加以说明。
10. 循环嵌套次数不大于3次(如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数)。
建议for语句的循环控制变量的取值采用“半开半闭区间”写法
for (int x=0; x<N; x++) { //推荐
…
}
for (int x=0; x<=N-1; x++) { //不推荐
…
}
11: 函数的命名,参数要用描述该参数的关键字命名。
不要使用 and 来连接用属性作参数的关键字
推荐
- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;
反对
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;
返回值为BOOL类型的,方法名要使用单词 is或has 做前缀
-(BOOL)isNetWorkConnected;
12. 函数方法不能为多个目的服务做到一个方法一个功能。
13. 对输入参数的正确性和有效性进行检查,很多程序错误和崩溃是由非法参数引起的(添加数组,字典之类的分类进行值保护)
14. 函数(方法)体的规模不能太大,尽量控制在100行之内(函数不利于调试,可读性差)
15. Controller控制器
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观
控制器(Controller)--> 负责转发请求,对请求进行处理。
视图(View) --> 界面设计人员进行图形界面设计。
模型(Model) --> 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)
16. 能少用通知尽量少用,可用delegate或者block替换。
delegate修饰要用weak
@property (weak, nonatomic) id<MYWebViewDelegate> delegate;
通知发起后记得释放掉
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
17. 宏的使用 FOUNDATION_EXPORT的使用方法:
FOUNDATION_EXPORT NSString * const kTestString;(.h文件)
NSString * const kTestString = @“Test”;(.m文件)
上面的这种常量定义方法就相当于
#define kTestString @“Test"; (以字母 k 开头,后面遵循大驼峰命名)
由于过多的宏定义会产生过多的二进制文件,故如果宏定义比较多,建议用FOUNDATION_EXPORT
18.代码注释
(1)多行注释采用”/* … */”, 单行注释采用 “// …”.
注释语言必须准确、易懂、简洁(需要注释)
(2)注释应与其描述的代码相近,对代码的注释应放在其上方或右方相邻位置,不可放在下方,如放于上方则需要与其上面的代码用空行隔开。
(3)注释与所描述内容进行同样地缩排。
19. release版本代码去掉NSLog打印,除了保留异常分支的NSLog。
20. 枚举常量:采用系统自带宏定义NS_ENUM、NS_OPTIONS枚举变量如:
typedef NS_ENUM(NSInteger, AppNoticeType) {
AppNoticeTypeFault = 1, //故障提醒
AppNoticeTypeGuard = 2,//防盗提醒
AppNoticeTypeRoutine //日常管理
};
21: 使用ARC
除非想要兼容一些老机器和操作系统,我们没有理由放弃使用ARC。在最新版的Xcode中,ARC是自动打开的,所以直接使用就好了
22. 在 init 和 dealloc 中不要用存取方法访问实例变量
// 正确,直接访问实例变量
- (instancetype)init {
self = [super init];
if (self) {
_bar = [[NSMutableString alloc] init];
}
return self;
}
- (void)dealloc {
[_bar release];
[super dealloc];
}
23. 资源的释放按照定义的顺序释放资源
在类或者Controller的生命周期结束时,往往需要做一些扫尾工作,比如释放资源,停止线程等,这些扫尾工作的释放顺序应当与它们的初始化或者定义的顺序保持一致。这样做是为了方便调试时寻找错误,也能防止遗漏。