一、 命名规范
命名必须明确易懂,使用英文单词或其组合,不能使用中文拼音,不能在名字中间使用下划线,资源文件名除外。
1. 变量
1)第一个单词首字母小写,其他单词首字母大写。如:
NSString *companyName;
2)使用系统的常用类作为变量声明时,以类名为后缀。如:
NSArray *groupArray;
NSLabel *nameLabel;
3)类中的成员变量以下划线“_”开头。属性命名,与去掉“_”前缀的成员变量相同,使用@synthesize将二者联系起来。
2. 常量
1)#define常量字母全部大写,单词之间以下划线分隔,如:
#define BUTTON_WIDTH 100;
2)enum常量单词首字母都大写,如:
typedef enum {
TranspondTypeUnknown = 0,
TranspondTypeBroadcast = 1,
TranspondTypeGameCenter = 2,
TranspondTypeTopic = 3,
TranspondTypeOther = 4,
}TranspondType;
3. 类
1)单词首字母均大写,文件和类同名;
2)使用系统的常用类作为变量声明时,以类名为后缀。如:
HomepageViewController;
GroupHeaderView;
3)协议(委托)命名与类命名相同,此外需添加“Delegate”后缀。如:
UITableViewDelegate;
4)分类(类别)命名与类命名相同,此外需添加要扩展的类名和“+”。如:
NSString+URLEncoding;
4. 方法
方法名和方法参数名首字母小写,其他单词首字母大写。如:
- (void)showCustomNavigationBarWithTitle:(NSString*)title
leftButton:(UIButton*)leftButton
rightButton:(UIButton *)rightButton;
5. 资源文件
以功能模块名为前缀,以下划线连接文件描述。
二、 书写规范
1. 代码缩进以4个字符为单位。
2. 中括弧的两个括弧不能写在同一行。
正确的做法:
for (int i = 0; i < 10; i++)
{
}
不推荐的做法:
for (int i = 0; i < 10 i++){
}
for (int i = 0; i < 10 i++){}
3. 空格的使用
1)关键字与其后的表达式之间要有空格。如:if (expr)。
2)单目操作符不应与它们的操作数分开,如“!”和“^”等。
3)除“, ”外,其它双目操作符应与它们的操作数用空格隔开。
正确的做法:
i = i + 1;
if (a > b)
错误的做法:
i=i+1;
if(a>b)
4).h文件中协议<>前面有一个空格。
5).h文件中成员声明时,类型与变量之间有至少1个空格;
“*”号靠近变量,不靠近类型。
6)声明属性时,@property后留1个空格;
()里面,逗号紧跟前一变量,与后一变量之间留1个空格;
()外面,先留1个空格,再声明属性。
7)方法的“+”,“-”后面与()之间留1个空格。
8)返回类型与“*”之间留1个空格;
方法参数中返回类型与“*”之间留1个空格;
在多参数方法中,每个参数后面都有1个空格。
当参数过长时,每个参数占用一行,以冒号对齐。如:
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval
{
}
如果方法名比参数名短,每个参数占用一行,缩进4个字符并垂直对齐。
如:
- (void)short:(GTMFoo *)theFoo
longKeyword:(NSRect)theRect
evenLongerKeyword:(float)theInterval
{
}
方法调用时也遵循以上规范。
4. 每行只能有一个语句。
正确的做法:
NSUInteger objectIndex;
NSUInteger stuffCount;
错误的做法:
NSUInteger objectIndex, stuffCount;
5. 空行的使用
1).h文件中的空行
文件说明与头文件包含(#import)之间空1行。
头文件包含(#import)之间,如需分类区别,各类别之间空1行。
头文件包含(#import)与@class之间空2行。
@interface与@class之间空1行。
头文件{}里面,空1行开始声明成员变量,如需分类区别,各类别之间空1行。
头文件{}外,空1行开始写属性,如需分类区别,各类别之间空1行。
属性下面空1行开始写方法,如需分类区别,各类别之间空1行。
方法完成后,空1行@end。
如果需要声明protocol,空2行接着写,通常protocol写在@end后面,
但是声明在@interface之前。
2).m文件中的空行
文件说明与头文件包含(#import)之间空1行。
头文件包含(#import)之间,如果需要分类区别,各类别之间空1行。
@implementation和@synthesize之间空1行, 如果需要分类区别,各类别之间空1行。
@synthesize与方法之间空1行。
方法与方法之间空1行。
3)方法里面的空行
变量声明后需要空1行,如需分类区别,各类别之间空1行。
条件、循环和选择语句结束后空1行。
各代码块之间空1行。
最后一个括弧之前不空行。
注释与代码之间不空行。
#pragma mark 与方法之间空1行,#pragma mark前空2行。
6. 在switch语句中,每一个case分支和default要用{ }括起来,{ }中的内容需要缩进。
三、 注释规范
1. 注释可以采用“/* */ ”和“// ”两种注释符号,多行注释时尽量使用前者。
2. 单行代码的注释可放在前一行或本行上,不允许放在下一行,更不允许在一行语句的中间加入注释。 且“//”与文字之间要加空格。
3. 文件的注释要遵循如下格式:
//
// 文件名
// 工程名
//
// 创建日期
// 版权声明
//
4. 方法的注释要遵循如下格式:
/*
功能描述:xxx
输入参数:xxx
返回值:xxx
*/
四、 编程惯例
1. 引入其它类时,若要作为实例变量的在.h文件中引入,否则在.m文件中引入。
2. 声明实例变量一律以属性声明。
其它类要访问的实例变量和方法在.h文件中声明,否则声明于.m文件中。
3. 功能模块以#pragma mark –分隔。
4. 版本release时,去除NSlog,在.pch文件使用如下代码:
#ifndef __OPTIMIZE__
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) {}
#endif
5. 每个方法尽量不要多于100行,每个文件尽量不多于1000行。
6. 最好不要在语句块内声明局部变量。
7. 不要编写太复杂的复合表达式。
8. 在switch语句中,每一个case分支必须使用break结尾,最后一个分支必须是default分支。
9. 不可在for 循环体内修改循环变量,防止for 循环失去控制。
10. 循环嵌套层数不大于2层。
11. addObject/setObject之前要进行非空判断。
12. 释放子view前,先把子view中的delegate置为nil,防止野指针。
13.