内容简介:Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果和谷歌都已经有很好的总结:本文主要参考了对上述文档的翻译、查阅其他的相关资料和经过公司 iOS 小组的深刻讨论,为公司 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 中,并根据模块区分存放不同文件夹
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 编码、摘要和加密(一)——字节编码
- 新媒体编码时代的技术:编码与传输
- MySQL数据库字符编码总结--数据传输编码
- PHP 开发者学 Golang 之 URL 编码 (Urlencode)、解编码 (Urldecode)
- ios平台实现视频H264硬编码及软编码(附完整demo)
- Python 中文编码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
卓有成效的程序员
Neal Ford / 熊节 / 机械工业出版社 / 2009-3 / 45.00元
《卓有成效的程序员》就是讲述如何在开发软件的过程中变得更加高效。同时,《卓有成效的程序员》的讲述将会跨语言和操作系统:很多技巧的讲述都会伴随多种程序语言的例子,并且会跨越三种主要的操作系统,Windows(多个版本),Mac OS X以及 *-nix (Unix或者Linux)。 《卓有成效的程序员》讨论的是程序员个体的生产力,而不是团队的生产力问题,所以它不会涉及方法论(好吧,可能总会在......一起来看看 《卓有成效的程序员》 这本书的介绍吧!