iOS object-c 规范

1.代码结构

函数分组和protocol/delegate中实现的代码用#pragema mark -进行分割,例如:

#pragma mark - Lifecycle
- (instancetype)init {}
- (void)dealloc {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}

#prageme mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

2.代码缩进

代码缩进使用4个空格(如果使用tab要将一个tab设置为4个空格)例如:

if (enable) {
    //Do Something
}

3.代码注释

代码注释需要保持最新且有效
注释的代码尽量删掉,除非有一定要保留的理由
在能够使用代码自注释的情况下,应尽量避免使用注释

4.命名

OC的命名尽可能的将变量含义表达清楚,不必在乎过长,例如:

应该:
UIButton *settingButton
不应该简写为:
UIButton *setBtn

属性的命名采用驼峰式,单词的首字母小写。属性使用@property 关键字,不要自己手动写@ synthesize

应该:
@property (nonatomic, copy) NSString *chatPlatform;
不应该
id someValue

5.属性特性

所有属性的特性应该显式的列出来,且在定义属性变量的时候尽量按业务模块来定义。空格格式参照例子,例如

应该:
//构造方法相关变量
@property (nonatomic, assign) int64_t chatId;
@property (nonatomic, copy) NSString *cmId;

//表情动画相关变量
@property (nonatomic, strong) LPEmojiAnimationView *smileAnimationView;
@property (nonatomic, strong) LPEmojiAnimationView *heartAnimationView;
不应该:
@property (nonatomic,weak)IBOutlet UIView *containerView;
@property(nonatomic) NSString *tutorialName;

NSString 应该使用copy而不是使用strong

6.变量

  • 变量的命名应该用描述的方式命名,不要用数字、单个字符来命名
    应该:
    CGFloat imageHeight = 44.0f
    
    不应该:
    CGFloat h = 44.0f
    
  • 星号表示变量是指针。例如,NSString *text,不是 NSString * text也不是NSString* text

7.方法

方法的命名,应该在方法的类型(-/+)之后有一个空格。在方法的各个段之间应该也有一个空格。在参数之前应该包含一个描述该参数的关键字。

应该:
- (void)setUserName:(NSString *)name headImage:(UIImage *)headImage;
不应该:
- (void)setUserName:(NSString *)name  h:(UIImage *) headImage;

8.字面值

NSStringNSDictionaryNSArrayNSNumber的 字面值应该在创建这些类的不可变实例时被使用。但是nil值不能传入NSDictionaryNSArray字面值,会导致crash。

应该:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingStreetNumber = @10018;
不应该:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingStreetNumber = [NSNumber numberWithInteger:10018];

9.常量

常量是容易被重复使用和代替就能快速修改的值。常量应使用static来声明而不是用#defeine定义一个宏来代替。

应该:
static NSString *MyCellIdentifier = @"MyCellIdentifier";
static CGFloat const MyCellHeight = 44.0f;
不应该:
#define MyCellIdentifier = @"MyCellIdentifier";
#define MyCellHeight = 44.0f;

#define 的使用建议用于一些宏函数的定义,例如

#define RGBCOLOR(r, g, b)  [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]

10.Case 语句

打括号在case语句中并不是必须的,除非编译器强制的要求。当一个case语句有多行代码的时候,打括号应该加上
例如:

switch (condition) {
  case 1:
    // ...
    break;
  case 2: {
    // ...
    // Multi-line example using braces
    break;
  }
  case 3:
    // ...
    break;
  default: 
    // ...
    break;
}

11.布尔值

Objective-C使用YESNO。不要使用true和false。nil解析成NO,所以没有必要再条件语句中比较。不要拿某样东西直接与YES比较。

应该:
if (someObject) {}
if (![anotherObject boolValue]) {}
不应该:
if (someObject == nil) {}
if ([anotherObject boolValue] == NO) {}
if (isAwesome == YES) {} // Never do this.
if (isAwesome == true) {} // Never do this.

12.条件语句

条件语句主体为了防止出错应该使用大括号包围,即使条件语句主体能够不用大括号编写(如,只用一行代码)。这些错误包括添加第二行代码和期望它成为if语句;还有,even more dangerous defect可能发生在if语句里面一行代码被注释了,然后下一行代码不知不觉地成为if语句的一部分。除此之外,这种风格与其他条件语句的风格保持一致,所以更加容易阅读。

应该:
if (!error) {
  return success;
}
不应该:
if (!error)
  return success;
或
if (!error) return success;

13.三目运算符

当需要提高代码的清晰性和简洁性时,三元操作符?:才会使用。单个条件求值常常需要它。多个条件求值时,如果使用if语句或重构成实例变量时,代码会更加易读。一般来说,最好使用三元操作符是在根据条件来赋值的情况下。

Non-boolean的变量与某东西比较,加上括号()会提高可读性。如果被比较的变量是boolean类型,那么就不需要括号。

应该:
NSInteger value = 5;
result = (value != 0) ? x : y;

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

推荐阅读更多精彩内容

  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,431评论 21 35
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 推荐文章:禅与 Objective-C 编程艺 前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、...
    WolfTin阅读 2,749评论 0 1
  • 牵扯了阿拉斯加的风度 大片的冰河极光匍匐仰望 也许你也不曾想过 下一次穿越空气和光 你是为什么游荡在远和近的罅隙 ...
    觅安阅读 398评论 0 0
  • 一.绵绵的雨 1. 雨还在下。 已经没完没了地持续几天了,好像提前进入了梅雨季节。 李瀚站在门口,看着雨滴打在石板...
    昆仑濯羽阅读 519评论 5 5