关于注释:
1.新建类或修改类的时候,注意在controller类名或者独立的View组件类名上,加上这个页面的名称描述注释。举例:如STJobPerfectViewController 学生身份的职责完善页面
2.每个.h文件顶部创建人姓名必须是中文拼音,不能随意定制英文名。举例:// Created by iOnRoad on 2017/7/12.
3.下掉的功能和页面直接删除掉就可以了,不能直接简单的屏蔽掉。想要对比参照可以找老版本。
属性声明
1.公开属性在.h中声明,私有属性在.m中声明
@property (nonatomic, assign) NSInteger number;
2.
3.声明变量时,尽可能指定类型,不要使用id代替。
4.@property声明属性时,必须指定assign,weak,copy,strong等,不能省略。
5.局部变量不能使用下划线作为前缀。
常量声明,不要采用#define。
static const NSInteger kGetCodeTimeInterval = 30;
方法声明
1.-后面与方法名间加空格, { 前加空格,多参数不需要and等连接语句,参数之间加空格。
- (NSInteger)ageWithPerson:(Person *)person country:(Country *)country {
… //implementation
}
3.方法之间用换行隔开一行。
4.方法大括号和其他大括号紧随语句,不要换行。
5.方法需要归类,不要随意摆放,以 #pragma mark - 隔开,顺序为系统方法放在最前面,其次是公开方法,其次是私有方法,其次是委托,其他。
#pragma mark - system
//此处需要换行隔开
- (void)viewDidLoad {
}
//此处需要换行隔开
#pragma mark - public
…
#pragma mark - private
…
#pragma mark - xxx delegate
…
#pragma mark - yyy delegate
…
#pragma mark - other
…
7.方法有返回值时,方法命名以返回值语意作为开头
- (NSInteger)age {
return 20;
}
9.在方法内,不同变量的定义使用,需要换行隔开,不要堆在一起。
- (void)initPropertyInfo {
_usernameLabel = [[UILabel alloc] init];
self.usernameLabel.text = @“测试”;
//注意:此处需要回车换行来隔开。
_imTableView = [[UITableView alloc] init…];
_imTableView.delegate = self;
}
11.方法命名以方法功能语意作为方法名解析,而不是根据点击事件或随机。
//推荐
- (void)submitRechargeRequest:(NSInteger)coinNumber {
}
//不推荐 - (void)tapSubmitButton:(NSInteger)coinNumber {
}
类声明
1.以项目名大写缩写作为前缀,以功能名定义,以继承的系统类名字结尾。
#import <UIKit/UIKit.h>
@interface FBWelfareViewController
…
@end
2.
3.#import 与 @interface 或 @implementation 需要回车隔开。
枚举声明
1.以项目名大写缩写作为前缀,成员类型名字前面追加枚举名字
typedef NS_ENUM(NSInteger, FBCellStyle) {
FBCellStyleSystemDefault,
FBCellStyleSystemValue1,
};
2.
委托声明
1.声明委托时,尽量把调用者作为参数进行声明,既能获取值传递,也能明确知道谁在调用。
@protocol ImageClickDelegate
- (void)imageContainerView:(ImageContainerView *)containerView replaceImage:(UIImage *)image;
@end
@ineterface ImageContainerView : UIView
@property (nonatomic, weak) id delegate;
@end
@implementation
- (void)invokeMethod {
if([delegate respondsToSelector:@selector(imageContainerView:replaceImage:)]){
[delegate imageContainerView:self replaceImage:image];
}
}
@end
2.
命名规则,采用驼峰式
1.变量命名按语意命名,如userLoginInfo;
2.常量需以k开头,并加上const防止被修改,如kGetCodeTimeInterval;
3.控件命名需要追加控件标识,如usernameLabel;
4.中间变量s以tmp开头,如tmpUsername;
语句判断
1.针对nil,bool判断
//推荐
if (boolValue) {
}
if (objectValue) {
}
//不推荐
if (boolValue == YES) {
}
if (objectValue != nil) {
}
2.
3.单语句条件赋值
id result = object ? : otherObject;
//或
BOOL result = age > 0
4.
5.单语句中,只允许使用一次三元运算符。
6.判断固定值时,将固定值放在判断前面。
if ([@“abc” isEqualToString:str]) {
}
7.
8.if 或 case语句,不要省略后面的大括号,
if(xx) { } 或case 0: { }。
9.
10.标准的if else 写法
//注意条件语句中的空格。
if (condition) {
…implemetion
} else {
…implemetion
}
11.
12.判断语句时,如有返回值,尽快返回。注意黄金路径。
//推荐
if (condition) {
retrurn NO;
};
…
return YES;
//不推荐
Bool boolValue;
if (condition) {
boolValue = YES;
} else {
boolValue = NO;
}
return boolValue;
13.
初始化
1.采用字面量初始化
NSArray *array = @[];
NSMutableArray *mutArray = [@[] mutableCopy];
NSDictioanry *dict = @{@“key”😡“value”, @“key1”😡“value1”};
NSString *string = @“abc”;
NSNumber *number = @(10);
2.
3.成员变量初始化时,采用_str = @[ (a,)b]; 来避免getter/setter的副作用。
4.成员变量用self.来调用, 局部变量直接调用。
5.init方法返回instancetype类型,而不是id。
@property (strong, nonatomic) NSMutableArray *stringArray;
-
(instancetype)init {
self = [super init];
if (self) {
//推荐
_stringArray = [@[@“a”,@“b”] mutableCopy];
[self.stringArray addObject:@“c”];
//不推荐
self.stringArray = [@[@“a”,@“b”] mutableCopy];
…//局部变量,用self.来区分 NSString *string = @"d"; [self.stringArray addObject:string];
}
}
7.尽量在使用的时候才声明变量,尽量少用成员变量。
其他实战项目规则
1.缩进符,以Tab键为缩进,不要打空格。
2.@interface 与 成员变量声明需要加隔开一行,与方法声明也换行隔开。
@interface FBWelfareViewController : UIViewController
//此处,隔开一行
@property (copy, nonatomic) NSString *welfareDesp; …
//此处再隔开一行,开始方法声明
- (void)setupUI;
@end
3.
4.用到的成员变量,需要直接声明,而不是通过字典隐式获取。
@property (assign, nonatomic) NSInteger age;
-
(void)upValue:(NSDictionary *)param {
self.age = [param[@“age”] integerValue];
} -
(void)setupUI {
//推荐
self.ageLabel.text = [@(self.age) stringValue];;
//不推荐
self.ageLabel.text = [NSString stringWithFormat:@"%@",self.parameter[@“age”]];
}
6.在viewDidLoad中,初始化成员信息统一放在最前面,换行隔开后,然后再分别处理各个变量,同时不同的变量处理也需要换行隔开。
- (void)viewDidLoad {
self.age = 0;
_imArray = [@[] mutableCopy];
_usernameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
//此处,隔开一行
[self.imArray addObject:@“a”];
if ([self ageWithPerson:person] > 0) {
[self.imArray addObject:@“b”];
}
//此处,在隔开一行
self.usernameLabel.backgroundColor = [UIColor clearColor];
self.usernameLabel.text = @“初始化值”; }
8.视图中,尽可能不要出现model的身影,需要外界可控的控件开发在.h中,或者以方法参数的传递来修改内部控件的属性。
@interface FBCoinInputTextField
@property (weak, nonatomic) IBOutlet UILabel *coinTitleLabel; //该coinTitleLabel是外界可以改变的,需开放出来
//推荐
- (void)fillTextFieldWithContent:(NSString *)content placeHolder:(NSString *)placeHolder font:(UIFont *)font;
//不推荐 - (void)fillTextFieldWithResponse:(FBWelfareResponse *)response;
@end
9.
关于换行
1.在.h文件中的换行原则
2.在.m文件中的换行原则
3.文件说明与头文件包涵(#import)之间换行
4.头文件包涵(#import)之间,如果需要分类区别,各类别之间换行
5.头文件包涵(#import)与@class之间换行
6. (interface与)class之间换行
7.@inteface 与 @property 之间换行
8.@property 与 方法声明 之间换行
9.方法 与 @end 之间换行
10.文件说明与头文件包涵(#import)之间换行。
11.头文件包涵(#import)之间,如果需要分类区别,各类别之间换行。
12.各方法之间换行。
13.#pragma mark - 与方法之间换行。
关于空格
@property (weak, nonatomic) NSString string;
1…h中采用协议时,<>前面有1个空格
2…h中成员声明时,类型与变量之间有至少1个空格。号靠近变量,不靠近类型。
3.@property与()有1空格,()里面逗号后有1个空格,()后留1个空格,再声明属性
4.方法+,-后,与()之间有1个空格
5.返回类型与之间有1个空格,方法参数中返回类型与之间有1个空格
6.多参数的方法,每一个参数后面都有1个空格
7.对象与调用方法之间,有1个空格。