注:有些例子是摘抄的,如有侵权请联系删除,另如有不妥请指正。
一 、尽可能保证 .h文件的简洁性,可以不公开的API和属性就不要公开,写在.m文件中即可;一旦公开,请把注释写详细明了,方便别人调用。
二、.m文件代码结构,如图:
三、命名
1、成员变量前加“_”,类名首字母大写(大驼峰),成员变量及成员方法首字母小写(小驼峰),成员方法中的参数首字母小写(小驼峰),同时尽量让方法的命名读起来像一句话,能够传达出方法的意思,同时取值方法前不要加前缀“get”。
2、常量的命名 k + 类名 + 变量名
static const NSTimeInterval kAnimationDuration = 0.3;
- 若常量作用域超出编译单元(实现文件),需要在类外可见时, 使用extern关键字, 并加上该类名作为前缀. 如
extern NSString *const PGThumbnailSize
- 全局常量(通知或者关键字等)尽量用const来定义. 因为如果使用宏定义, 一来宏可能被重定义. 二来引用不同的文件可能会导致宏的同。
3、枚举的命名 类名前缀 + 变量名
枚举类型命名要加相关类名前缀并且枚举值命名也要加枚举类型前缀.编程中避免使用写死的值,多使用枚举表示状态、选项、状态码,方便阅读,管理。
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
4、变量和对象的命名
给一个对象命名时建议采用修饰+类型的方式
titleLabel //表示标题的label, 是UILabel类型
confirmButton //表示确认的button, 是UIButton类型
附一些常用控件的缩写:
常用对象 | 缩写 | 常用对象 | 缩写 |
---|---|---|---|
UILabel | Lbl | NSArray | Arr |
UIButton | Btn | NSMutableArray | MArr |
NSMutableString | Mstr | NSDictionary | Dict |
UIViewController | VC | NSMutableDictionary | MDict |
UIImageView | ImgView | NSString | Str |
四、私有方法
在OC语言中,声明一个方法为私有的,需要把方法写在实现文件里.如何凸显该方法私有的呢?根据笔者的经验,建议大家给方法命名以p_,也可以项目前缀开头.如
// 以p_开头,较为常用,便于开源
- (void)p_dealWithDataSource:(NSData *)sourceData {
}
// 以项目前缀maj(muaijie)开头,也比较常用
- (void)maj_dealWithDataSource:(NSData *)sourceData {
}
关于前缀还有必要补充说明一下.苹果声明自己始终保有两字前缀,所以在实际开发中尽量使三字前缀,以避免因苹果引入新的API导致的问题.
五、关于注释
- 开头的版权声明
- 在每个文件的头部应简要说明这个文件的指责或者实现的功能
内容注释 分为单行注释和多行注释,择机使用,尽可能把注释写的如同文档一样规范明了。多行注释生成工具我推荐使用VVDocumenter
/** * 特卖活动商品列表 * @param sequencing 排序方式 * @param activityId 专场ID * @param success 成功后返回的data * @param falilure 失败后返回的错误码 * @return 专场商品Model */ - (ActivityGoodsList *)getActivityGoodsList:(int)sequencing activityId:(NSString *)activityId Success:(NewHttpSuccess)success Failure:(HttpFailure)falilure { // }
六、关于多参数的方法的写法,参数冒号对齐,空格恰当。
- (ActivityGoodsList *)getActivityGoodsList:(int)sequencing
activityId:(NSString *)activityId
Success:(NewHttpSuccess)success
Failure:(HttpFailure) falilure
{
//
}
七、其他
- 项目的目录应该按照功能来划分
- 每一个功能属于一个单独的真实的文件夹,避免使用group导致项目里文件杂乱
- 图片资源文件应该使用Images.xcassets存放管理
- 原则上讲单个 .m 文件代码量不应该超过800行
tips
1、 判断nil或者YES/NO
推荐:
if (someObject) { ... }
if (!someObject) { ... }
不推荐:
if (someObject == YES) { ...}
if (someObject != nil) { ...}
2、 条件赋值
推荐:
result = object ? : [self createObject];
不推荐:
result = object ? object : [self createObject];
3、 BOOL赋值
推荐:
BOOL isAdult = age > 18;
不推荐:
BOOL isAdult;
if (age > 18)
{
isAdult = YES;
}
else
{
isAdult = NO;
}
4、 复杂的条件判断
软件设计的单一职责原则
推荐:
if ([self canDeleteJob:job]) { ... }
- (BOOL)canDeleteJob:(Job *)job
{
BOOL invalidJobState = job.JobState == JobState.New
|| job.JobState == JobState.Submitted
|| job.JobState == JobState.Expired;
BOOL invalidJob = job.JobTitle && job.JobTitle.length;
return invalidJobState || invalidJob;
}
不推荐:
if (job.JobState == JobState.New
|| job.JobState == JobState.Submitted
|| job.JobState == JobState.Expired
|| (job.JobTitle && job.JobTitle.length))
{
//....
}
5、block防止循环引用的写法
block为了防止循环引用以及提前释放,在block外__weak修饰,block内__strong修饰
__weak typeof(self) weakSelf = self;
myObj.myBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething]; // strongSelf != nil
// preemption, strongSelf still not nil
[strongSelf doSomethingElse]; // strongSelf != nil
}
else {
// Probably nothing...
return;
}
};