iOS编码规范

以下所有纯属个人习惯,不喜勿喷

语言:应该使用美国英语命名 如

UIColor  *myColor = [UIColor whiteColor];

而不是:

UIColor *myColour = [UIColor whiteColor];

注释

1、方法注释

注释必须列出 函数名称、功能描述、输入参数、返回值描述、修改信息等

备注:方法名称、功能描述要正确描述。

/**

* 方法名称

* 功能描述

*

* @param 输出参数1  输出参数描述

* @param 输出参数2  输出参数描述

*

* @return 返回值  返回值描述

*

* 其他说明:如修改信息等

*

*/

2、对单条语句注释

注释应与其描述的代码相近,对代码的注释应该放在其上方或右方相邻位置,不可放在下面,需与上一行代码隔开一行空行

/* 代码段1注释*/

[代码段1];

/* 代码段2 注释*/

[代码段2];

3、方法大括号和其他大括号(if/else/switch/while 等.)总是在同一行语句打开但在新行中关闭

应该:

if (user.isHappy) {

//Do something

} else {

//Do something else

}

不应该:

if (user.isHappy)

{

//Do something

}

else{

//Do something else

}

4、避免以对齐方式调用含有block代码块的方法

应该:

// blocks are easily readable

[UIView animateWithDuration:1.0 animations:^{

// something

} completion:^(BOOL finished) {

// something

}];

不应该:

// colon-aligning makes the block indentation hard to read

[UIView animateWithDuration:1.0

animations:^{

// something

}

completion:^(BOOL finished) {

// something

}];

命名

Apple命名规则尽可能坚持长的,描述性的方法和变量性

//应该:

UIButton *settingsButton;

//不应该:

UIButton *setBut;

备注:对于一些特殊类型的变量,命名时要带上类型,如NSArray的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。千万不能将NSArray的变量命名为xxxDictionary。

const 常量命名

常量应该使用驼峰式命名规则,所有单词首字母大写和加上与类名有关的前缀

//应该:

static NSTimeInterval const kRWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;

//不应该:

static NSTimeInterval const fadetime = 1.7;

一些常量前加特殊前缀,可以作为不同常量的区分,

如:

/**

* UserDefault Key 的常量前加 ‘kUDK’,

* NotificationName Key 的常量前加‘kNNK’,

* Dictionary Key    的常量前加‘kDICK’,

* Model Key    的常量前加    ‘kMDK’,

* Localizable Key  的常量前加 ‘kLOCK’,

* 第三方服务 Key    的常量前加 ‘kVENDK’,

* 十六进制颜色值    的常量前加 ‘kHEXCOR’,

* 图片资源名字  的常量前加 ‘kIMGN’

*/

备注:‘k’for  ‘constant’  ‘K’ for ‘key’

宏定义命名

应当能够表达它的用途,并且使用大写字母表示,每个单词间用’_’分开

如果使用宏定义表示常量则前面必须加k表示理解为常量“constant“,不过建议使用const定义常量

类的命名

1.所有类名均以大写字母开头,多单词组合时,后面单词首字母大写。类接口名必须有意义

2、所有类名前面添加前缀 “RJ”

3.继承自UIView的类以View结尾。

如:RJOperatorUsersInfomationView

4.继承自ViewController的类以ViewController结尾。

如:RJHomeViewController

5.所有保存数据的实体以Model结尾。

如:RJUserModel

属性也是使用驼峰式

对于属性的实例化,我们应该尽可能使用延迟实例

@property (strong , nonatomic) UIView *descriptionView;

//应该:

- (UIView *)descriptionView {

if (!_descriptionView) {

_descriptionView = [[UIView alloc] init];

}

return _descriptionView;

}

//不应该

self.descriptionView = [[UIView alloc] init];

下划线

当使用属性时,实例变量应该使用’self.’来访问和改变。

备注:在初始化方法里,实例变量(如:_variableName)应该直接被使用来避免getters/setters潜在的副作用。

局部变量不应该包含下划线。

方法

在方法签名中,应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格(符合Apple的风格)。在参数之前应该包含一个具有描述性的关键字来描述参数。

"and"这个词的用法应该保留。它不应该用于多个参数来说明,就像initWithWidth:height以下这个例子:

//应该:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;

- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;

- (id)viewWithTag:(NSInteger)tag;

- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

//不应该:

-(void)setT:(NSString *)text i:(UIImage *)image;

- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;

- (id)taggedView:(NSInteger)tag;

- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;

- (instancetype)initWith:(int)width and:(int)height;  // Never do this.

变量

1.变量尽量以描述性的方式来命名。单个字符的变量命名应该尽量避免,除了在for()循环。

2.星号表示变量是指针。例如, NSString *text 既不是 NSString* text 也不是 NSString * text,除了一些特殊情况下常量。

3.私有属性应该尽可能代替实例变量的使用。尽管使用实例变量是一种有效的方式,但更偏向于使用属性来保持代码一致性。

//应该:

@interface RWTTutorial : NSObject

@property (nonatomic, strong) NSString *tutorialName;

@end

//不应该:

@interface RWTTutorial : NSObject {

NSString *tutorialName;

}

属性特性

所有属性特性应该显式地列出来,有助于新手阅读代码。属性特性的顺序应该是nullable,nonatomic,readonly,strong

,与在APPLE 本身框架库代码一致。

//应该:

@property (nonatomic, weak) IBOutlet UIView *containerView;

@property (nonatomic) NSString *tutorialName;

//不应该:

@property (weak, nonatomic) IBOutlet UIView *containerView;

@property (strong, nonatomic) NSString *tutorialName;

代码组织

在函数分组和protocol/delegate实现中使用 ‘#pragma mark – ’来分类方法,要遵守以下一般的结构:

#pragma mark - Lifecycle

- (instancetype)init {}

- (void)dealloc {}

- (void)viewDidLoad {}

- (void)viewWillAppear:(BOOL)animated {}

- (void)didReceiveMemoryWarning {}

#pragma mark - IBActions

- (IBAction)submitData:(id)sender {}

#pragma mark - Public

- (void)publicMethod {}

#pragma mark - Private

- (void)privateMethod {}

#pragma mark - Protocol conformance

#pragma mark - UITextFieldDelegate

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

#pragma mark - NSCopying

- (id)copyWithZone:(NSZone *)zone {}

#pragma mark - NSObject

- (NSString *)description {}

#pragma mark - Custom Accessors

- (void)setCustomProperty:(id)value {}

- (id)customProperty {}

黄金路径

当使用条件语句编码时,上边的代码应该是"golden" 或 "happy"路径。也就是不要嵌套if语句,多个返回语句也是OK。


//应该:

- (void)someMethod {

if (![someOther boolValue]) {

return;

}

//Do something important

}


//不应该:

- (void)someMethod {

if ([someOther boolValue]) {

//Do something important

}

}

换行符

换行符是一个很重要的主题,因为它的风格指南主要为了打印和网上的可读性。

例如:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

//一行很长的代码应该分成两行代码,下一行用两个空格隔开。

self.productsRequest = [[SKProductsRequest alloc]

initWithProductIdentifiers:productIdentifiers];

Init方法

Init方法应该遵循Apple生成代码模板的命名规则,返回类型应该使用instancetype而不是id。

- (instancetype)init {

self = [super init];

if (self) {

// ...

}

return self;

}



类构造方法

当类构造方法被使用时,它应该返回类型是instancetype而不是id。这样确保编译器正确地推断结果类型。

@interface Airplane

+ (instancetype)airplaneWithType:(RWTAirplaneType)type;

@end

修改规范

1、新增代码行

新增代码行的前后应有注释行说明。

//修改人,修改时间,修改说明

新增代码行

//修改结束

2、删除代码行

删除代码向的前后用注释行说明

//修改人,修改时间,修改说明

要删除的代码行(将要删除的语句进行注释)

//修改结束

3、修改代码行

修改代码行以注释旧代码行后再新增代码行的方式进行。

//修改人,修改时间,修改说明

//修改前代码行开始

//修改前代码行

//修改前代码行结束

//修改后代码行开始

修改后代码行

//修改结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 注释规范 文件头注释 文件头注释采用如下格式,该注释由xcode自动生成。如果你对其他人的原始代码作出重大的修改,...
    yangzming阅读 724评论 0 1
  • 命名 Bundle id命名: 规则:采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名根据应用进行...
    Tippi阅读 1,620评论 0 2
  • 一.代码命名 一般性原则 最好是既清晰又简短,但不要为简短而丧失清晰性。 例如:removeObject:AtIn...
    睡不完懒觉阅读 1,766评论 0 16
  • IOS开发规范 公司新项目马上要启动,整理一篇规范,供参考。 命名规范 驼峰法,除第一个单词之外,其他单词首字母大...
    面皮大师阅读 338评论 0 3
  • 整理了一下 Android 上 View 绘制的流程,绘制流程图如下:
    牧秦丶阅读 212评论 0 0