iOS开发规范
目录
- 格式与换行
- 命令
- OC编码规范
- 注释要求
- 其他
序
- 此文档根据apple以及行业内比较知名的OC编码规范整理归纳而成,意在为以后的iOS开发规范提供一份简单、统一的执行标准。
1.格式与换行
1.1使用Xcode默认使用四个空格来缩进
1.2方法长度较长时可以考虑提取其中一部分。
1.3-方法和+方法和返回值前面的左括号间隔一个空格
- 例:- (void)func {
}
1.4条件语句采用苹果推荐的代码缩进方式。
- 推荐写法
BOOL isOk = YES;
if (isOk) {
//...
}else{
//...
}
2.命名
2.1命名统一使用驼峰命名法;只采纳有广为人知含义的缩写。自造的缩写不被认可。总体的命名原则是清晰一直,避免歧义。
2.2,确保整个项目中的自定义类名称是统一的,同时确保类名需要大写字母开头。
2.3 类名命名需要结合功能或者模块。
2.4 方法命名小写字母开头,文件夹首字母大写开头。不要使用下划线开头作为方法的前缀。
2.5 定义类的变量,不需要暴露的变量均放在实现文件里定义,同时视图类变量,在类拓展下定义成属性。数据类型的变量定义在@implementation
下的大括号内。
3.OC编码规范
3.1使用#pragma mark 来分类方法,如:
#pragma mark - UITableViewDataSource
#pragma mark – Private Methods
3.2重载系统方法的时候,如无特殊情况均需先调用super的方法。
3.3 属性必须指定其类型,如(nonatomic,strong)
3.4 使用#import
引入oc/oc++文件,使用#include
引入c/c++文件
3.5尽量减少公开的api接口的数量。
3.6枚举的定义使用如下方式
typedef NS_ENUM(NSInteger,BgViewType) {
BGVIEWTYPE_DEFAULT = 1,
BGVIEWTYPE_TIPREMOVE, //点击移除
};
4. 注释要求
4.1 新版本Xcode自带有添加注释的功能
- 单行注释:在方法的地方按
Command+/
- 标注的功能,快捷键是
Command+ Option + /
- 需要在方法名的上面(空白)处按
Command+ Option + /
4.2 在新建一个类的时候需要在头文件中添加注释来说明其作用。
4.3 在穿件接口类的时候,同样需要在头文件添加注释来说明该类的用处。
4.4 一些过于简单的注释尽量不要添加。
5. 其他
5.1 if
和else
语句
- 不论
if
或者else
下一个还是有多个语句,都必须带上大括号。同样case
语句也是如此。 - 推荐写法
if(case) {
return success;
}
- 不允许的写法
if (case)
return success;
//或者
if (case) retrun success;
5.2 布尔值
- 推荐写法
if (someObject) {
//...
}
if (![object boolValue]) {
//...
}
5.3 三元操作符
- 当需要提高代码的清晰性和间接性,三元操作符?:才会使用。
*推荐写法
NSInteger value = 5;
result = (value != 0) ? x : y;
BOOL isHorizontal = YES;
result = isHorizontal ? x : y;
- 不推荐写法
result = a > b ? x = c > d ? c : d : y;
5.4 Init方法
- 当前构造方法被使用时,它应该返回类型是
instancetype
而不是id
。这样确保编译器正确地推断结果类型。
@interface Animate
+ (instancetype)animateWithName:(AnimateName)name;
@end
5.6 CGRect
函数
- 推荐用法
CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
5.7 黄金路径
- 当使用条件语句编码时不要嵌套if语句,多个返回语句也是OK。
- 推荐写法
- (void)func {
if (!case) {
retrun;
}
//Do something
}
5.8 单例模式
- 单例对象应该使用线程安全模式来创建共享示例。
+ (instancetype)sharedInstance {
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
5.9 布局中的空格
- 每个方法或者功能块之间为了接口清晰,应当有且仅有一行空格。
@interface AClass:NSObject
@property (noatomic, strong) UIView *aView
- (void)aMethod;
@end
@implementation AClass
- (void)setAView:(UIView *)aview {
}
- (void)aMethod {
}
@end
5.10 Getters 和 Setters 放到底部
- 控制器可能会有非常多的
view
属性和其他属性,如果所有的getters
和setters
放到前面,就会导致implementation
代码顶部有大量的初始化代码,这就导致了主要的逻辑代码挪后面去了,导致其他人阅读代码不带方便。
5.11 Delegate要使用弱引用
- 一个类的Delegate对象通常还引用这类本身,这样很容易造成循环引用问题,所以累的Delegate属性要设置为弱引用
5.12 属性的线程安全
- 定义一个属性时,编译器会自动生成线程安全的存取方法(Atomic),但这样会大大降低性能,特别是需要频繁存取的属性来说,是极大的浪费。所以如果定义的属性不需要线程保护,记得手动添加属性关键字nonatomic来取消编译器的优化。
5.12 点分语法的使用
- 不要使用点分语法来调用方法,只用来访问属性。这样是为了增加代码的可读性。
5.13 nil检查
- 因为在OC中想nil对象发送命令是不会抛出异常或者崩溃的,只是完全的“什么都不做”,所以,要在程序中使用nil来做逻辑上的检查。
另外,不要使用nil == Object的形式判断。
//正确方式
if (!object) {
//...
}
//错误方式
if (nil == object) {
//...
}
网友评论