命名
- 应使用英语命名,而不是中文拼音
推荐
NSString *password = self._passField.text
不推荐
NSString *mima = self._passField.text
- 不要使用含义不明的简写,尽量写全单词,如有必要简写,含义需清晰易懂
推荐
backgroundInitial//或者backgroundInit```
**不推荐**
- 驼峰命名,常量首字母大写,属性和实例变量首字母小写,类名和协议名首字母大写
@interface VistorUpgradeViewController : DefaultThemeViewController
@end//类
int const CityCounts = 100;//常量
NSString *currentCity;//变量
@property (strong, nonatomic) NSString *descriptiveVariableName;//属性
- 属性不要加下划线前缀
推荐
@property(strong, nonatomic) UITextField *pwdConfirmField;
不推荐
@property(strong, nonatomic) UITextField *_pwdConfirmField;
- 添加类别时,方法名可添加前缀,防止重名
推荐
@interface NSDate (ZOCTimeExtensions)
-(NSString *)zoc_timeAgoShort;
@end
不推荐
@interface NSDate (ZOCTimeExtensions)
-(NSString *)timeAgoShort;//如果NSDate类本身已有该方法,则会导致方法被该类别覆盖
@end
代码组织
- 使用
#pragma mark -
进行代码分段,分段方式可以是:getter/setter -- life cycle -- delegate -- event response -- private method
缩进与格式
- 使用xcode默认的偏好设置,即使用tab或者4个空格
- 大括号开始在方法名同一行,结束在单独一行
推荐
#pragma mark - action
-(void)cancelBtnPressed:(UIButton *)sender{
[self.navigationController popViewControllerAnimated:YES];
}
不推荐
#pragma mark - action
-(void)cancelBtnPressed:(UIButton *)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
- 方法参数较多时,用分号对齐分行显示
推荐
-(void)checkVerifyCode:(NSString*)phoneNum
withCode:(NSString*)code
withSuccess:(void(^)(InterfaceModal*))onSuccess
withFail:(void(^)(NSString*))onFail;
不推荐
-(void)checkVerifyCode:(NSString*)phoneNum withCode:(NSString*)code withSuccess:(void(^)(InterfaceModal*))onSuccess withFail:(void(^)(NSString*))onFail;
- 函数分行时,如果第一个名称过短,后续名称可以以Tab的长度(4个空格)为单位进行缩进
推荐
-(void)short:(GTMFoo *)theFoo
longKeyword:(NSRect)theRect
evenLongerKeyword:(float)theInterval
error:(NSError **)theError {
};
不推荐
-(void)short:(GTMFoo *)theFoo
toolongKeyword:(NSRect)theRect
evenLongerKeyword:(float)theInterval
error:(NSError **)theError {
};
注释
xcode8集成了以前的VVDocument插件,使用option+command+/可实现对方法或属性的注释
注释枚举
使用oc风格的枚举
推荐
typedef NS_ENUM(NSInteger,LoginWay){//oc风格
LoginWayUser,
LoginWayVistor,
};
不推荐
typedef enum{//c风格
LoginWayUser,
LoginWayVistor,
}LoginWay;
self.和_访问实例变量
当init,dealloc方法被执行时,类的运行时环境不是处于正常状态的,使用存取方法访问变量可能会导致不可预料的结果,因此应当在这两个方法内直接访问实例变量
推荐
- (instancetype)initWithNum:(NSString *)num
{
self = [super init];
if (self) {
_phoneNum = num;
}
return self;
}
不推荐
- (instancetype)initWithNum:(NSString *)num
{
self = [super init];
if (self) {
self.phoneNum = num;
}
return self;
}
判断是否为空
推荐
if (self.codeTextField.text.length == 0 || !self.codeTextField.text) {
[self showMessageBox:@"验证码不能为空" mode:MBProgressHUDModeText];
[self hideMessageBox];
}
不推荐
if (self.codeTextField.text.length == 0 || self.codeTextField.text == nil) {
[self showMessageBox:@"验证码不能为空" mode:MBProgressHUDModeText];
[self hideMessageBox];
}
条件语句
- 条件语句主体为了防止出错应该使用大括号包围,即使条件语句主体能够不用大括号编写(如,只用一行代码)
推荐
if (!error) {
return success;
}
不推荐
if (!error) return success;
- 当if判断有多层嵌套,应该尽量使用黄金路径,即不符合条件的分支先返回,这样可以避免分支嵌套
推荐
-(void)someMethod {
if (!condition1) {
return;
}
//Do something1
if (!condition2) {
return;
}
// Do something 2
}
不推荐
-(void)someMethod {
if (condition1) {
//Do something1
if (condition2) {
// Do something 2
}
}
}
宏定义
尽量少使用宏来定义常量,因为使用大量宏,容易造成编译时间久,每次都需要重新替换。可用const来代替。
推荐
#ifndef GlobalConstant_h
#define GlobalConstant_h
const int TABLEHEIGHT = 10;
#endif /* GlobalConstant_h */
不推荐
#ifndef GlobalConstant_h
#define GlobalConstant_h
#define TABLEHEIGHT 10
#endif /* GlobalConstant_h */
网友评论