芦苇科技 [ 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 中, 并根据模块区分存放不同文件夹
友情链接
1.iOS 切图规范
2.App 测试方法汇总
来源: https://juejin.im/post/5bff92cbf265da616b106c4e