iOS团队代码规范

工程之始可能需要的工具:

1、使用CocoaPods类库管理工具。CocoaPods安装和使用教程。

2、下载安装注释插件VVDocumenter-Xcode

一、项目结构管理

1、建立Resouces文件夹,将所有图片,语音,视频等资源放入其中。图片资源以程序功能模块建立相应的实体文件夹进行管理,若多个功能块共用的,建立Common文件夹,放入其中。

2、所有需手动拖入工程中的第三方库应放入ThirdLibs文件夹中,使用CocoaPods类库管理工具的无须此操作。


3、建立Utilities文件夹,将封装的工具类放入其中。


4、建立CatororyExs文件夹,将类别及类扩展放入以类名命名的文件夹中。


5、建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。


6、每个功能模块放入一个Group。用Xcode创建的Group是虚拟的文件夹,为了便于维护,应创建物理文件夹,然后再手动引入。

二、命名规范

关于命名的一般性的原则

1.最少字符,就是要尽量的减少命名对象的长度,尽量选择字符少的名词
2.名符其实,命名应该能直观的描述被命名对象是什么或者做什么
3.避免歧义,尽量不要采用多义词,也不要使用命名组合之后产生多义的方式
4.上下文一致,比如谓词的统一性,如果都是集合类,那么使用Remove表示删除操作,那么所有上下文就应该都用这个Remove,而不要再用Delete
5.少用缩写,除非是很常见的缩写或者项目中定义好的缩写,否则不要使用缩写
6.优先使用全局常量而非宏,应使用static方式声明常量;

类命名

1、首字母大写,之后每个单词首字母都大写。

2、使用能够反映类功能的名词短语。

3、文件名应包含描述继承的类,如:文件名:BaseViewController   类:UIViewController

所有类名,接口名(Protocol)均以大写字母开头,多单词组合时,后面的单词首写字母大写。

如:@interface LoginViewCotroller : UIViewController
View--所有扩展自UIView的类以View结尾,如: GridView,StarView,OpenGLView,EmojiPageView。
ViewController-所有扩展自UIViewController的类以ViewController结尾,
Model--所有数据Model以Model结尾 如 HomePageViewControler, LoginViewController。
如果名称太长则以VC结尾:如 AllPicturePreviewVC

4、自定义控件命名,以相应类名为后缀命名。
对于UI相关的变量,命名时要后缀以特定的控件名,如UILabel的变量命名为xxxLabel,xxxCell,其他的如xxxButton,xxxTableView,xxxImageView等;

特殊类命名

举例:BaseClient、ImageStore

分类(类别)命名

与类命名相同,此外需添加要扩展的类名和“+”
举例:NSString+URLEncoding

协议(委托)命名

与类命名相同,此外需添加“Delegate”后缀
举例:UITableViewDelegate,MBProgressHUDDelegate

方法及参数命名

方法:

首字母小写,之后每个单词首字母都大写
方法名使用动词短语,能具体表达出该方法的功能

参数:

首字母小写,之后每个单词首字母都大写
具有足够的说明性

举例:

- (void)viewWillAppear:(BOOL)animated
- (void)setupPostValue:(int)value
- (void)adjustFontWithMaxSize:(CGSize)maxSize

参数要用描述该参数的标签命名

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

当参数过长时,每个参数占用一行,以冒号对齐。如:

-(void)saveUserInfo:(NSMutableDictionary *)dict
userName:(NSString *)name
passWord:(NSString *)pwd{
...
}

getset 开头的方法有特殊的意义,不要随意定义。

  1. set 是属性默认的设置方法,如果函数不是为了设置类成员,则不要用 set 开头,可用 setup 替代。
  2. get 和属性方法无关,但在 Cocoa 中,其标准行为是通过引用传值,而不是直接返回结果的。欲获取变量,直接以变量名为名,如:userInfomation,而不是 getUserInfomation

5、属性和变量

数据成员保持最小公开原则。
在需要公开一个数据成员时将其声明为属性,反之声明为实例变量。
在不需要改变一个属性时,添加@readonly,需要时添加@readwrite。
属性采用Camel命名方式。
实例变量的命名方式同属性,不过首尾都加下划线,加尾部下划线可区分属性对应的实例变量。
局部变量的命名方式同属性,禁用下划线。
定义NSString时,如果不是明确的想要引用,则应该添加@copy,大多数情况下我们是把NSString当成值类型使用的。
@public,@protected,@private缩进一个空格。
如果为BOOL属性的名称最好以“is”开头。

三、编码规范

1、导入.h文件可使用
#import xxxxxxxx ,需要的时候可以加@class xxxxxxxx

2、代码模块划分及标注

类中单个个功能模块以 #pragma mark - (功能描述) 分隔。与方法相隔一空行,如:

- (void)method1
{
// code...
} #pragma mark - xxxx - (void)method2
{
// code...
}

方法与方法之间应相隔一空行,“///”注释插件描述方法的具体功能,如:

- (void)method1
{
// code...
} /**
* function
*/
- (void)method2
{
// code...
}

3、对象初始化的书写。如:

// 应该这样书写
UILabel *label = [[UILabel alloc] init]; 而不是
UILabel *label=[[UILabel alloc]init];
UILabel *label = [[UILabel alloc] init ];
UILabel*label=[[UILabel alloc]init];
。。。

4、有oc对象初始化的地方应空一行,若有需要应给相应对象加//注释描述。如:

- (void)method1
{
// 标题
UILabel *titleLabel = [[UILabel alloc] init];
label.text = @"title"; NSString *string = [[NSString alloc] init];
}

5、格式问题
指针*与前面的数据类型留1个空格,紧贴后面的变量名;

例如:
NSString *password; 而不是
NSString* password; 或者
NSString * password;

与运算符之间的空格,如:

for (int i = 0; i < 5; i++)
{
// code...
}

注释问题
在需要的时候,注释可对代码做必要的解释。应保证每个变量每个重要的函数有注释,更新代码时一定要更新注释,防止对代码造成误解。

四、其他

性能优化
用  DLOG(<#...#>)代替 NSLog(...)

关于布尔值

1,不要用if(obj==nil){},而用if(!obj){}

2,比较时把常量放前面可以避免错误

不要用if(aIntValue==255){},而用if(255==aIntValue){},避免漏掉一个“=”,而变成赋值

3,不要用if(aBool==YES){},直接用if(aBool){}或if(!!aBool){}

空指针nil传值问题
在创建NSString,NSDictionary,NSArray和NSNumber等对象实例时,应使用Literals字面量。需要注意的是,不应将nil传给NSArray和NSDictionary字面量,否则会引起程序崩溃。

例如:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018; 而不是
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys:@"Kate", @"iPhone", @"Kamal", @"iPad", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];

其他规范
避免相同的代码段在多个地方出现,尽量编写可复用的代码。
语句嵌套层次不得超过3层,对性能等消耗大。
每个实现文件建议在500行以内,不能超过1000行,超过之后应考虑通过抽象类对代码进行重构。
及时删除或注释掉无用的代码。
UITableViewCell里面的network client都要委托出来。
控件布局使用相对坐标。
确定不使用的代码应该删除。

参考规范文档:
 
 
 
 

iOS团队代码规范的更多相关文章

  1. 中小型前端团队代码规范工程化最佳实践 - ESLint

    前言 There are a thousand Hamlets in a thousand people's eyes. 一千个程序员,就有一千种代码风格.在前端开发中,有几个至今还在争论的代码风格差 ...

  2. IOS开发-代码规范

    代码风格的重要性对于一个团队和项目来说不言而喻.网上有许多 Objective-C 的代码风格,但这份简洁而又最符合苹果的规范,同时有助于养成良好的代码习惯,也是我们团队一直遵循的代码风格. 写法没有 ...

  3. 腾讯Alloy团队代码规范

    概述 我个人很看重代码规范,因为代码是写给别人看的,按规范写别人才更容易理解.之前苦于没有代码规范的资料,现在在github上面看到了腾讯Alloy团队的代码规范,于是学习了一下,并记录下我自己还没怎 ...

  4. iOS开发代码规范(通用)

    1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...

  5. iOS开发代码规范

    1.关于命名 1.1统一要求 含义清楚, 尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称不使用缩写 1.2类的命名 大驼峰式命名:每一个单词的首字母都采用大写字母例子: MFHomeP ...

  6. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  7. 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范

    工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考 我打算采用Information flow的方式自上而下,两大层分为基础层和展现层的结构.基础层分为多 ...

  8. (转)ios 代码规范

    转自http://blog.csdn.net/pjk1129/article/details/45146955 引子 在看下面之前,大家自我检测一下自己写的代码是否规范,代码风格是否过于迥异阅读困难? ...

  9. 【转】iOS代码规范

    原文地址: http://www.cocoachina.com/ios/20150908/13335.html 简介: 本 文整理自Apple文档<Coding Guidelines for C ...

随机推荐

  1. SSH公/私秘钥的生成及使用

    如果使用GitHub比较多的朋友,对SSH Key肯定也不陌生,当我们SSH进行代码的pull&push时,往往需要我们配置SSH Key. 如果Linux用的多朋友,肯定对SSH Key都很 ...

  2. .net core获取本地Ip地址的方法

    笔记: /// <summary> /// 获取本地Ip地址 /// </summary> /// <returns></returns> public ...

  3. JUC之多线程锁问题

    多线程锁 8种问题锁状态: 该部分全部围绕的是以下内容并结合相应的例子:synchronized实现同步的基础:Java中每个对象都可以作为锁. 具体表现为以下三种形式:(之前只是简单的了解) 对于普 ...

  4. nexus私服SNAPSHOT仓库maven-metadata.xml缺失导致的Could not find artifact:***.jar

    环境:maven项目,使用Nexus私服(ip:192.168.10.100),jenkins实现代码的编译和打包. 问题分析思路:在2021年元旦假期前,jenkins上的编译打包任务一直正常工作, ...

  5. Selenium_获取界面handle、title和url(7)

    from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...

  6. antd-vue中的form表单label标签for导致点击文字触发输入框解决方案

    <a-form-item :label="label+'图片'" :label-col="{ span: 2 }" :wrapper-col=" ...

  7. doT.js模板用法

    前提:引入doT.min.js: <script type="text/javascript" src="js/jquery.js"></sc ...

  8. POJ3090Visible Lattice Points

    http://poj.org/problem?id=3090 对于此题,观测点的数目,从小规模开始观察,可以得到每一个点,由一根无限长的绳子,绕着原点旋转,得到的第一个点.换另外一个思路,每一个观察到 ...

  9. Java NIO Channel 使用

    Java NIO 中的 Channel 分类: FileChannel SocketChannel ServerSocketChannel DatagramChannel channel 分类 Fil ...

  10. 深入浅出 CSS 动画

    本文将比较全面细致的梳理一下 CSS 动画的方方面面,针对每个属性用法的讲解及进阶用法的示意,希望能成为一个比较好的从入门到进阶的教程. CSS 动画介绍及语法 首先,我们来简单介绍一下 CSS 动画 ...