1.代码结构
函数分组和protocol/delegate中实现的代码用#pragema mark -
进行分割,例如:
#pragma mark - Lifecycle
- (instancetype)init {}
- (void)dealloc {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}
#prageme mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
2.代码缩进
代码缩进使用4个空格(如果使用tab要将一个tab设置为4个空格)例如:
if (enable) {
//Do Something
}
3.代码注释
代码注释需要保持最新且有效
注释的代码尽量删掉,除非有一定要保留的理由
在能够使用代码自注释的情况下,应尽量避免使用注释
4.命名
OC的命名尽可能的将变量含义表达清楚,不必在乎过长,例如:
应该:
UIButton *settingButton
不应该简写为:
UIButton *setBtn
属性的命名采用驼峰式,单词的首字母小写。属性使用@property 关键字,不要自己手动写@ synthesize
应该:
@property (nonatomic, copy) NSString *chatPlatform;
不应该
id someValue
5.属性特性
所有属性的特性应该显式的列出来,且在定义属性变量的时候尽量按业务模块来定义。空格格式参照例子,例如
应该:
//构造方法相关变量
@property (nonatomic, assign) int64_t chatId;
@property (nonatomic, copy) NSString *cmId;
//表情动画相关变量
@property (nonatomic, strong) LPEmojiAnimationView *smileAnimationView;
@property (nonatomic, strong) LPEmojiAnimationView *heartAnimationView;
不应该:
@property (nonatomic,weak)IBOutlet UIView *containerView;
@property(nonatomic) NSString *tutorialName;
NSString 应该使用copy
而不是使用strong
6.变量
- 变量的命名应该用描述的方式命名,不要用数字、单个字符来命名
应该:
CGFloat imageHeight = 44.0f
不应该:
CGFloat h = 44.0f
- 星号表示变量是指针。例如,
NSString *text
,不是NSString * text
也不是NSString* text
7.方法
方法的命名,应该在方法的类型(-/+)之后有一个空格。在方法的各个段之间应该也有一个空格。在参数之前应该包含一个描述该参数的关键字。
应该:
- (void)setUserName:(NSString *)name headImage:(UIImage *)headImage;
不应该:
- (void)setUserName:(NSString *)name h:(UIImage *) headImage;
8.字面值
NSString
、NSDictionary
、NSArray
、NSNumber
的 字面值应该在创建这些类的不可变实例时被使用。但是nil值不能传入NSDictionary
、NSArray
字面值,会导致crash。
应该:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingStreetNumber = @10018;
不应该:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingStreetNumber = [NSNumber numberWithInteger:10018];
9.常量
常量是容易被重复使用和代替就能快速修改的值。常量应使用static
来声明而不是用#defeine
定义一个宏来代替。
应该:
static NSString *MyCellIdentifier = @"MyCellIdentifier";
static CGFloat const MyCellHeight = 44.0f;
不应该:
#define MyCellIdentifier = @"MyCellIdentifier";
#define MyCellHeight = 44.0f;
#define
的使用建议用于一些宏函数的定义,例如
#define RGBCOLOR(r, g, b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
10.Case 语句
打括号在case语句中并不是必须的,除非编译器强制的要求。当一个case语句有多行代码的时候,打括号应该加上
例如:
switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
case 3:
// ...
break;
default:
// ...
break;
}
11.布尔值
Objective-C使用YES
和NO
。不要使用true和false。nil
解析成NO
,所以没有必要再条件语句中比较。不要拿某样东西直接与YES
比较。
应该:
if (someObject) {}
if (![anotherObject boolValue]) {}
不应该:
if (someObject == nil) {}
if ([anotherObject boolValue] == NO) {}
if (isAwesome == YES) {} // Never do this.
if (isAwesome == true) {} // Never do this.
12.条件语句
条件语句主体为了防止出错应该使用大括号包围,即使条件语句主体能够不用大括号编写(如,只用一行代码)。这些错误包括添加第二行代码和期望它成为if语句;还有,even more dangerous defect可能发生在if语句里面一行代码被注释了,然后下一行代码不知不觉地成为if语句的一部分。除此之外,这种风格与其他条件语句的风格保持一致,所以更加容易阅读。
应该:
if (!error) {
return success;
}
不应该:
if (!error)
return success;
或
if (!error) return success;
13.三目运算符
当需要提高代码的清晰性和简洁性时,三元操作符?:才会使用。单个条件求值常常需要它。多个条件求值时,如果使用if语句或重构成实例变量时,代码会更加易读。一般来说,最好使用三元操作符是在根据条件来赋值的情况下。
Non-boolean的变量与某东西比较,加上括号()会提高可读性。如果被比较的变量是boolean类型,那么就不需要括号。
应该:
NSInteger value = 5;
result = (value != 0) ? x : y;
BOOL isHorizontal = YES;
result = isHorizontal ? x : y;
不应该:
result = a > b ? x = c > d ? c : d : y;