芦苇科技 【 iOS 编码规范 】
概要
Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果和谷歌都已经有很好的总结:
Apple Coding Guidelines for Cocoa Google Objective-C Style Guide
本文主要参考了对上述文档的翻译、查阅其他的相关资料和经过公司 iOS 小组的深刻讨论,为公司 iOS 小组总结出一份通用的编码规范
命名规范
- 基本原则
驼峰命名(特殊除外)
followAnchorButton
复制代码
尽可能清晰,尽量不使用缩写,建议使用完整单词
// 建议
setBackgroundColor
headImageView
settingButton
// 不建议
setBkgColor
headImg
setBtn
复制代码
- 命名类
使用前缀:类前缀一般为项目名称缩写开头大写字母
前缀 + 描述 + 类型
//SuperTA
|- STLoginViewController
|- STUserInfoModel
|- STHomeTableCell
|- STCenterTableHeaderView
复制代码
- 命名方法
按照苹果的说法“好的方法名应当可以以一个句子的形式朗读出来”
一般以小写字母开头,每一个后续的单词首字母大写
// 动词开头的方法表示让对象执行一个动作
- (void)invokeWithTarget:(id)target;
复制代码
- 命名属性
属性同样遵循第一个字母小写,后续单词首字母大写,同时不必添加前缀,采用非原子性 nonatomic + 对应内存管理方式关键字(这里不尽描述)进行修饰
在 (nontomic,
后添加空格,在 NSString
和 *
前面均有空格,在 *
后面不需要空格!
// 建议
@property (nonatomic, copy) NSString *userName
// 不建议
@property (nonatomic,copy)NSString * userName
复制代码
- 命名实例变量
命名实例变量,在变量名前加上 _
前缀,其他和命名属性一样,建议 BOOL 类型的实例变量采用 _is
开头
@implementation simpleClass {
BOOL _isShowVip;
NSString *_uploadImageUrlString
}
复制代码
- 命名协议
当前类类名 + Delegate
// STCenterHeaderView
@protocol STCenterHeaderViewDelegate <NSObject>
复制代码
- 协议方法
去掉项目大写前缀的协议名前面部分+具体方法命名
// STCenterHeaderViewDelegate
- (void)centerHeaderButtonClickWithTag:(NSInteger)tag
复制代码
- RAC 的命名 调用 RAC 的时候,可以把所有方法实现在一个基础方法中
- (void)pickRac;
复制代码
class 结构
为明确区分 class 中方法类型,使 class 结构更清晰,最快定位到指定方法,特别是在 Controller 中,一旦逻辑稍微复杂,不熟悉代码很难一下子找到。so,这里从几个部分划分成几个模块,并尽量使用以下顺序。在每部分方法前用 pragma mark - <#object#>
注释
#pragma mark - life cycle // class 生命周期 #pragma mark - set & get // setter & getter 方法 #pragma mark - request // 网络请求 #pragma mark - notification // 通知 #pragma mark - action // 事件处理(例:按钮点击事件) #pragma mark - delegate // 代理方法 #pragma mark - setupUI // UI 相关 #pragma mark - lazy load // 懒加载 #pragma mark - delloc 复制代码
代码格式
- 方法书写
一个典型的 Objective-C 方法应该是这样的:
- (void)uploadImage:(UIImage *)image withToken:(NSString *)token linkAddress:(NSString *)linkAddress
{
}
复制代码
在-
和(void)
之间应该有一个空格,第一个大括号{
单独占一行。
- 方法调用
注意一点是如果方法有多个参数或者方法过长,那么应该按照 :
来对其分行显示
[self uploadImage:image
withToken:token
linkAddress:linkAddress];
复制代码
- 协议 Protocols
在一个头文件中正确定义一个协议的如下
@class
引用当前类
<>
中的协议和类型名之间不需要添加空格
默认对协议方法不写修饰符 @required
@optional
,即默认为@required
,但特殊情况下协议方法不要求必须实现的,使用 @required
修饰协议方法
协议属性使用 weak
关键字修饰,并且一般统一命名为delegate
#import <UIKit/UIKit.h>
@class STMyWalletHeaderView;
@protocol STMyWalletHeaderViewDelegate<NSObject>
@optional
/** 1-提现 2充值 */
- (void)myWalletHeaderButtonClickWithTag:(NSInteger)tag;
@end
@interface STMyWalletHeaderView : UIView
@property (nonatomic, weak) id<STMyWalletHeaderViewDelegate> delegate;
@end
复制代码
项目规范
- MVC 设计模式
- UI 控件使用懒加载初始化
建议在整个项目中使用懒加载进行初始化,在初始化中定义好属性(例如定义好 UIButton 控件的属性),如果控件默认会显示在 view 上面则在懒加载中通过 addSubView 添加到 view ,使整个类文件代码更加清晰明朗。
例子:充值按钮的懒加载
-(UIButton *)rechargeButton
{
if (!_rechargeButton) {
_rechargeButton = [UIButton buttonWithTitle:@"充值"
atTitleSize:15
atTitleColor:White_Color
atTarget:self
atAction:@selector(buttonClick:)];
_rechargeButton.backgroundColor = Main_Color;
_rechargeButton.tag = 2;
_rechargeButton.layer.masksToBounds = YES;
_rechargeButton.layer.cornerRadius = 18;
[self addSubview:_rechargeButton];
}
return _rechargeButton;
}
复制代码
- Masonry 自动布局
建议在 setSubLayouat
方法中进行自动布局,在 viewDidLoad 中调用该方法
#pragma mark -- 布局
-(void)setSubLayout
{
[self.whiteView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.offset(10);
make.left.offset(16);
make.right.offset(-16);
make.height.offset(216);
}];
[self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.offset(30);
make.height.offset(38);
make.right.equalTo(self.thireLabel.mas_left).offset(-4);
}];
}
复制代码
- 枚举定义类型常量
如果要定义一组相关的常量,尽量使用枚举类型(enumerations),枚举类型的命名规则和函数的命名规则相同,建议使用 NS_ENUM
和 NS_OPTIONS
宏来定义枚举类型
从 1001 开始,根据苹果官方解释,0~1000 为苹果 SDK 使用
typedef NS_ENUM(NSInteger, ImagePickState){
ImagePickStateNormal = 1001, // 系统自带
ImagePickStateTZI // TZimagePick
};
复制代码
- 一般使用 Delegate 传值
在界面传值、监听状态等均建议统一使用 Delegate
注释规范
- 方法注释 快捷键 : Command + Option + /
/**
加载全景图片
@param imageName 全景图图片名称
*/
- (void)setImageWithName:(NSString *)imageName;
复制代码
- 属性注释
/** 创建时间 */
@property (nonatomic, copy) NSString *createTime;
复制代码
- 使用 #pragma mark - 区分方法
- 其他
为了别给自己埋坑,或者给后人留条路走,强烈要求在写逻辑,特别是复杂逻辑的时候要写好注释。
工程规范
- 目录结构
类文件除 AppDelegate 、man.h 外,其他均在 Classes 文件夹中,以模块划分,模块下面分别以 Model 、 View 、Controller 划分不同文件夹
例:
| — Classes
| — Main [基础框架]
| — Home [首页模块]
| — Model
| — View
| — Cell
| — Controller
| — Attention [关注模块]
| — Message [消息模块]
| — Center [个人中心模块]
| — Login [登录注册模块]
复制代码
- 图片资源
图片资源统一放在 Assets.xcassets 中,并根据模块区分存放不同文件夹