iOS代码规范

命名规范

原则: 防止命名冲突、可读性高
方式: 驼峰式命名法
说明: 每个模块都需要加上前缀

一、常量命名

1.1 在常量前边加上字母k作为标记

static const NSTimeInterval kAnimationDuration = 0.3

1.2 定义作为NSDictionary或者NSNotification的key值字符串时加上const关键字

NSString *const UIApplicationDidEnterBackgroundNotification

1.3 若常量作用域超出.m文件,需要在类外可见时,使用extern关键字,并加上类名前缀

extern NSString *const PGThumbnailSize

1.4 全局常量包括 通知 或者 关键字 都尽可能使用const定义
Tips


  • 使用宏定义可能导致宏被 重定义,引用不同的文件可能导致 宏不同
  • #define 也需要添加k前缀

二、枚举命名
2.1 枚举类型 命名要加相关类名前缀并且 枚举值命名 要加枚举类型前缀,示例如下

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
};

优点:增强类型检查,更好的代码可读性
三、 变量和对象的命名
方式: 修饰+类型

@property (nonatomic, strong) UILabel *titleLabel; //表示*标题*的label,是*UILabel*类型
@property (nonatomic, strong) UIButton *confirmButton; //表示*确认*的button,是*UIButton*类型

对于BOOL类型,需要加is前缀

- (BOOL)isEqualToString:(NSString *)aString;
- (BOOL)hasPrefix:(NSString *)aString;

四、 方法命名
4.1 添加 参数 提示

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender;

4.2 回调方法通知方法 的命名
原则: 动作发生之前用Will,发生之后用Did,询问是否发生用Should

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;  //将要选择这一行cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; //已经选择这一行cell
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); //是否高亮(选择这一行cell)

4.3 回调方法第一个参数是调用者

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (void)buttonTapped:(UIButton*)sender;

4.4 方法符合语法
大部分方法可以分为两类:要什么做什么


  • 要什么
    表示取得某个对象,要以名词作为方法的开头
- (UIImage *)imageNamed:(NSString *)name;

  • 做什么
    表示执行某种操作,要以动词作为方法开头
- (void)setUpNavBar

书写规范

一、 ViewController 书写规范
1.1 方法书写顺序(依次)

* 生命周期  
* 基类public方法  
* 代理方法  
* 本类private方法  
* 通知方法  
* 请求方法  
二、*代码目录分类* 规范  
2.1 总代码目录架构  
![](http://upload-images.jianshu.io/upload_images/59913-5dd33a1c3e43b2fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.2 Managers 目录  
![](http://upload-images.jianshu.io/upload_images/59913-c0b2dd78ed275195.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.3 Models 目录  
![](http://upload-images.jianshu.io/upload_images/59913-e0d7c9a4bbb55550.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.4 Controllers 目录  
![](http://upload-images.jianshu.io/upload_images/59913-176279229c98d2ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.5 General 目录  
![](http://upload-images.jianshu.io/upload_images/59913-4dfbc152ac0b9745.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.6 Macros 目录  
![](http://upload-images.jianshu.io/upload_images/59913-feffc82e7f96feb0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.7 Vendors 目录  
![](http://upload-images.jianshu.io/upload_images/59913-e137531eda752764.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
2.8 Assets.xcassets 目录  
![](http://7xpu01.com1.z0.glb.clouddn.com/Assets.xcassets%E7%9B%AE%E5%BD%95.png)  
三、 写码规范  
3.1 判断**nil**或者**YES/NO**  

```javascript
if (obj) 
  { 
    //... 
  }
if (!obj) 
  { 
    //... 
  }

3.2 NSArray NSDictionary 初始化方法

NSArray *contacters = @[@"Allen", @"Bob", @"Chirs"];
NSDictionary *bookInfo = @{@"BookName":@"iOS开发之进阶篇", @"BookPrice":@"999999.0RMB", @"BookAuthor":@"RenSihao"};
NSNumber *isHide = @NO;
NSNumber *errorCode = @404;

优点:简洁明了,同时防止初始化进去一个nil

3.3 定义属性尽可能写全参数

@property (nonatomic, readwrite, copy) NSString *name;
  • 如果是内部使用的属性, 需定义成该类的私有属性(写在.m文件的class extension里)
  • 对于拥有Mutable子类型的对象, 例如NSString NSArray NSDictionary NSDictionary, 一定要定义成copy属性
  • 尽量不要暴露mutable类型的对象在public interface, 建议在.h定义一个Inmutable类型的属性, 然后在.m的get函数里面返回一个内部定义的mutable变量
  • 不要出现混合声明,尽可能都使用@property声明
    3.4 BOOL类型赋值
BOOL isAdult = age > 18;
 

3.5 拒绝死值

if (country = Countries.China) 
  { //... }
const int adultAge = 18;
if (age > adultAge)
  { //... }

3.6 复杂的条件判断
如果判断较为复杂,尽可能写到一个方法里

if ([self canDeleteAccount:account])
    { //... }
/**
 method
*/
- (BOOL)canDeleteAccount:(account)
{
    if (account.balance == 0  || account.owner.isDead == YES || account.isCancel == YES)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

3.7 嵌套判断

if (!user.account) return NO;
if (!user.password) return NO;
return YES;

3.8 使用Block避免循环引用

  • block内部使用外部声明的强引用去访问对象A,则block内部会产生一个强引用指向对象A
  • block内部使用外部声明的弱引用去访问对象A,则block内部会产生一个弱引用指向对象A
__weak typeof(self) weakSelf = self;
obj.block = ^ {
    __strong typeof(self) strongSelf = self;
    if (strongSelf)
    {
        [strongSelf doSomething]; //strongSelf != nil
    }
    else 
    {
        //maybe nothing...
        return ;
    }
}

3.9 宏的格式
宏要写成大写至少一个字母大写,全部小写有时候Xcode不会自动提示
3.10 加载xib
加载xib名称使用 NSStringFromClass()

[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([UserListCell class]) bundle:nil] forCellReuseIdentifier:ID];

3.11 继承
子类继承父类方法,需要重写一定要先调用父类进行初始化操作
建议在父类方法后追加 NS_REQUIRES_SUPER ,作用是子类重写这个方法就会自动警告提示要调用这个super方法

- (void)addAllNotifications;

3.12 命名控件避开系统命名
例如

@property (nonatomic, strong) UILabel *textLabel; //错误命名
@property (nonatomic, strong) UILabel *contentLabel; //正确命名

3.13 id类型
id类型属性调用不能用点语法, 调用get方法只能用中括号

[id 方法名]

3.14 判断if书写方式

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) return 40;
    if (indexPath.row == 1) return 50;
    if (indexPath.row == 2) return 60;
    return 44;
}

3.15 快速调试
需要注释掉一个方法,在该方法内部第一行return即可,无需大段注释
3.16 监听键盘通知
使用

UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification

优点:无论键盘切换输入法,切换表情等原因导致frame更改,该通知一定会监听得到
3.17 通知命名
使用const修饰,以Notification结尾
3.18 BOOL类型属性
如果是声明BOOL类型,建议在括号中重写get方法

@property (nonatomic, readonly, getter = isKeyWindow) BOOL keyWindow;

3.19 自定义方法
不能使用and这个单词连接参数

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

3.20 点语法
尽可能使用点语法访问属性,但是访问其他实例对象使用括号

view.backgroundColor = [UIColor redColor];
[UIApplication sharedApplication].delegate; //推荐

[view setBackgroundColor:[UIColor redColor]];
UIApplication.sharedApplication.delegate; //不推荐

3.21 引用头文件
类的头文件(.m文件)尽量不要引用其他头文件,无需知道类的内部细节使用@class即可


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

推荐阅读更多精彩内容

  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,428评论 21 35
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序。关于Objectiv...
    DreamMmMmM阅读 1,146评论 0 7
  • 命名规范 总的来说, iOS命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). Objective-C ...
    FreshCoder阅读 409评论 0 3
  • WinPcap编程系列文章 WinPcap编程【1】--编程环境的设置(尽管似乎我加了lib也没有配置成功,某个程...
    ZoeyeoZ阅读 993评论 0 0