iOS团队代码规范
工程之始可能需要的工具:
1、使用CocoaPods类库管理工具。CocoaPods安装和使用教程。
2、下载安装注释插件VVDocumenter-Xcode。
一、项目结构管理
1、建立Resouces文件夹,将所有图片,语音,视频等资源放入其中。图片资源以程序功能模块建立相应的实体文件夹进行管理,若多个功能块共用的,建立Common文件夹,放入其中。
2、所有需手动拖入工程中的第三方库应放入ThirdLibs文件夹中,使用CocoaPods类库管理工具的无须此操作。
3、建立Utilities文件夹,将封装的工具类放入其中。
4、建立CatororyExs文件夹,将类别及类扩展放入以类名命名的文件夹中。
5、建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。
6、每个功能模块放入一个Group。用Xcode创建的Group是虚拟的文件夹,为了便于维护,应创建物理文件夹,然后再手动引入。
二、命名规范
关于命名的一般性的原则
1.最少字符,就是要尽量的减少命名对象的长度,尽量选择字符少的名词
2.名符其实,命名应该能直观的描述被命名对象是什么或者做什么
3.避免歧义,尽量不要采用多义词,也不要使用命名组合之后产生多义的方式
4.上下文一致,比如谓词的统一性,如果都是集合类,那么使用Remove表示删除操作,那么所有上下文就应该都用这个Remove,而不要再用Delete
5.少用缩写,除非是很常见的缩写或者项目中定义好的缩写,否则不要使用缩写
6.优先使用全局常量而非宏,应使用static方式声明常量;
类命名
1、首字母大写,之后每个单词首字母都大写。
2、使用能够反映类功能的名词短语。
3、文件名应包含描述继承的类,如:文件名:BaseViewController 类:UIViewController
所有类名,接口名(Protocol)均以大写字母开头,多单词组合时,后面的单词首写字母大写。
如:@interface LoginViewCotroller : UIViewController
View--所有扩展自UIView的类以View结尾,如: GridView,StarView,OpenGLView,EmojiPageView。
ViewController-所有扩展自UIViewController的类以ViewController结尾,
Model--所有数据Model以Model结尾 如 HomePageViewControler, LoginViewController。
如果名称太长则以VC结尾:如 AllPicturePreviewVC
4、自定义控件命名,以相应类名为后缀命名。
对于UI相关的变量,命名时要后缀以特定的控件名,如UILabel的变量命名为xxxLabel,xxxCell,其他的如xxxButton,xxxTableView,xxxImageView等;
特殊类命名
举例:BaseClient、ImageStore
分类(类别)命名
与类命名相同,此外需添加要扩展的类名和“+”
举例:NSString+URLEncoding
协议(委托)命名
与类命名相同,此外需添加“Delegate”后缀
举例:UITableViewDelegate,MBProgressHUDDelegate
方法及参数命名
方法:
首字母小写,之后每个单词首字母都大写
方法名使用动词短语,能具体表达出该方法的功能
参数:
首字母小写,之后每个单词首字母都大写
具有足够的说明性
举例:
- (void)viewWillAppear:(BOOL)animated
- (void)setupPostValue:(int)value
- (void)adjustFontWithMaxSize:(CGSize)maxSize
参数要用描述该参数的标签命名
- (void) sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag; //对
- (void) sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; //错
当参数过长时,每个参数占用一行,以冒号对齐。如:
-(void)saveUserInfo:(NSMutableDictionary *)dict
userName:(NSString *)name
passWord:(NSString *)pwd{
...
}
以 get
、set
开头的方法有特殊的意义,不要随意定义。
- set 是属性默认的设置方法,如果函数不是为了设置类成员,则不要用
set
开头,可用setup
替代。 - get 和属性方法无关,但在 Cocoa 中,其标准行为是通过引用传值,而不是直接返回结果的。欲获取变量,直接以变量名为名,如:
userInfomation
,而不是getUserInfomation
。
5、属性和变量
数据成员保持最小公开原则。
在需要公开一个数据成员时将其声明为属性,反之声明为实例变量。
在不需要改变一个属性时,添加@readonly,需要时添加@readwrite。
属性采用Camel命名方式。
实例变量的命名方式同属性,不过首尾都加下划线,加尾部下划线可区分属性对应的实例变量。
局部变量的命名方式同属性,禁用下划线。
定义NSString时,如果不是明确的想要引用,则应该添加@copy,大多数情况下我们是把NSString当成值类型使用的。
@public,@protected,@private缩进一个空格。
如果为BOOL属性的名称最好以“is”开头。
三、编码规范
1、导入.h文件可使用
#import xxxxxxxx ,需要的时候可以加@class xxxxxxxx
2、代码模块划分及标注
类中单个个功能模块以 #pragma mark - (功能描述) 分隔。与方法相隔一空行,如:
- (void)method1
{
// code...
} #pragma mark - xxxx - (void)method2
{
// code...
}
方法与方法之间应相隔一空行,“///”注释插件描述方法的具体功能,如:
- (void)method1
{
// code...
} /**
* function
*/
- (void)method2
{
// code...
}
3、对象初始化的书写。如:
// 应该这样书写
UILabel *label = [[UILabel alloc] init]; 而不是
UILabel *label=[[UILabel alloc]init];
UILabel *label = [[UILabel alloc] init ];
UILabel*label=[[UILabel alloc]init];
。。。
4、有oc对象初始化的地方应空一行,若有需要应给相应对象加//注释描述。如:
- (void)method1
{
// 标题
UILabel *titleLabel = [[UILabel alloc] init];
label.text = @"title"; NSString *string = [[NSString alloc] init];
}
5、格式问题
指针*与前面的数据类型留1个空格,紧贴后面的变量名;
例如:
NSString *password; 而不是
NSString* password; 或者
NSString * password;
与运算符之间的空格,如:
for (int i = 0; i < 5; i++)
{
// code...
}
注释问题
在需要的时候,注释可对代码做必要的解释。应保证每个变量每个重要的函数有注释,更新代码时一定要更新注释,防止对代码造成误解。
四、其他
性能优化
用 DLOG(<#...#>)代替 NSLog(...)
关于布尔值
1,不要用if(obj==nil){},而用if(!obj){}
2,比较时把常量放前面可以避免错误
不要用if(aIntValue==255){},而用if(255==aIntValue){},避免漏掉一个“=”,而变成赋值
3,不要用if(aBool==YES){},直接用if(aBool){}或if(!!aBool){}
空指针nil传值问题
在创建NSString,NSDictionary,NSArray和NSNumber等对象实例时,应使用Literals字面量。需要注意的是,不应将nil传给NSArray和NSDictionary字面量,否则会引起程序崩溃。
例如:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018; 而不是
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys:@"Kate", @"iPhone", @"Kamal", @"iPad", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];
其他规范
避免相同的代码段在多个地方出现,尽量编写可复用的代码。
语句嵌套层次不得超过3层,对性能等消耗大。
每个实现文件建议在500行以内,不能超过1000行,超过之后应考虑通过抽象类对代码进行重构。
及时删除或注释掉无用的代码。
UITableViewCell里面的network client都要委托出来。
控件布局使用相对坐标。
确定不使用的代码应该删除。