编码规范与指引,从小菜到大神的升级换代之路

在h文件中引用其他类用,C语言编程风格的内容相当庞大

object-c 编码规范与指引

了解C语言——从小菜到大神的升官之路(15)——已毕篇:C编程风格

有人说过:“程序源代码其实是跟人阅读的,只是刚刚机器可以编译而已”。编程初学者平常会有诸如此类2个价值观,就是本身的程序一旦编译通过了,运转没十分那就顺风了。至于代码的编制规半间半界,完全就是无足挂齿的小事情。借使是处在学习阶段,比如为了形成在全校的C语言课的作业,那么花心情在代码规范上实在没有特意的不可或缺,因为那么些代码基本不会进去实用工程,也不会被不少人观看到。

可是,如果利用到了工程领域,比如在软件/网络集团的技巧研发部门,只怕Github等平台上的开源工程,那么编程的规范性将变得极其紧要。因为在这一个场馆,你写的代码将被广大人旁观,并且可能会化为众多少人展开持续开发的底蕴。此时,差劲的代码风格将严重拉低其余开发人员的工作效用。由此,大家推荐从一起始读书便养成八个理想的编程习惯,维持多少个客观的代码风格,那样对前景的做事大有裨益。

C语言编程风格的内容万分庞大,那里只拔取部分针锋相对常用而且相比较主要的始末作为参考,主要分为多少个部分,包罗排版、注释、命名、变量/结构、函数等。

文档版本

版本号 修改时间 修改内容 修改人
1.0 2011-04-12 创建 贺发虎
1.1 2015-01-21 修改 谢躜

1、排版

次第排版使得代码的构造进一步清晰明了,而且促进驾驭上下文的逻辑关系。
(1)程序块应基于上下文关系采取缩进风格,缩进的长度依据实际标准规定;
(2)独立的次序块之间、变量说明之后必须加空行;比如:

int fun()
{
     int nVal1 = 0, nVal2 = 5, nSum;

     {
          nSum = nVal1 + nVal2;
     }

     printf("Sum is %d\n", nSum);
}

(3)一条语句占一行,不同意将两条语句写在一行中;
(4)对于存在判断、循环的代码,像if/for/do/while/case/swith/default等部分独占一行,且不论执行部分有微微条语句,都无法不选拔大括号{
};
(5)包裹代码块的大括号{
}必须另起一行,不要跟随上一行代码的尾声;且大括号也要顺应代码缩进规则;

概述

对此任何工程项目来说,统一的动工规范都是确保工程质量的基本点成分。堪称当今生人最抽象、最复杂的工程—软件工程,自然越发不能例外。高格调、易维护的软件开发离不开清晰严刻的编码规范。本文档详细描述object-C软件开发进度中的编码规范。本专业也适用于拥有在文档中出现的源码。

2、注释

声明纵然不影响程序的周转,但照旧是代码的紧要性组成部分。完善的代码注释对快捷通晓代码的功效具有重要性意义,相反假如代码逻辑复杂且并未注释,或注释不完全、不正确,那么别人很难明白那段代码毕竟是做什么的。需注意一点,外人不大概知道的程序即便运营优异,也永远都是垃圾代码。

丰硕注释需求注意,注释应简明、有效,有助于提高对代码的领会。所以添加注释应小心不要添加一些一心无意义或然不当的音讯。平日,大家认为一套代码依照优劣分为5个级次:
率先阶段:不需求注释,通过美好的代码风格、标识符命名和代码的上下文关系就足以达标高可读性的代码;
第②阶段:代码的命名和协会规范、风格稍显不足,但有完善的注释;
第1等级:代码风格和注释都不够周全,但是团队了相比完善的文档在放任自流程度弥补了这一缺陷;
第六等级:代码风格、注释和文档都不足,那种就属于其余人难以了然的垃圾堆代码。

函数底部的诠释:
在函数底部应充足注释,表明函数的效益、参数、再次回到值等音讯。上面的诠释格式比较完善,不必然要局限与此,但提出保留其中的一大半新闻:

/*************************************************
  Function: // 函数名称
  Description: // 函数功能、性能等的描述
  Calls: // 被本函数调用的函数清单
  Called By: // 调用本函数的函数清单
  Input: // 输入参数说明,包括每个参数的作
  // 用、取值说明及参数间关系。
  Output: // 对输出参数的说明。
  Return: // 函数返回值的说明
  Others: // 其它说明
*************************************************/

代码中的注释:
言辞的注释应在被诠释语句的正上方或右手。如若是在上面的话,除非十分需求否则不要再代码和注释之间插入空格。
对此拥有大体意义的常量和变量,以及数据结构,除非命名本人是丰裕诠释的,在宣称时必须加以注释。
全局变量要有详实的笺注,包蕴对其功用、取值范围、使用的函数以及存取时的注意事项等。
注明与上方的代码用一行空格间隔。
对拔取、循环语句应当添加注释,表达分支、循环体的意思。
在先后块停止的大括号右方添加注释,表明匹配的先后块伊始地方。
如以下代码:

if (...)
{
     program code
     while (index < MAX_INDEX)
     {
          program code
     } /* end of while (index < MAX_INDEX) */ // 指明该条while语句结束
} /* end of if (...)*/ // 指明是哪条if语句结束

文件结构

装有iphone的源文件均必须含有二个正规的验证,表明包罗了该文件的名目、功能概述、笔者、版权和本子历史音讯等内容。文件头和函数的辨证的格式为:

叁 、标识符命名

标识符命名是代码风格中的首要组成部分,甚至向来控制了代码可读性的音量。最常用的标识符无非就是常量名、变量/结构体名、函数名、宏定义、标签名等。对不一致的标识符类型一般适用不一样的渴求,但有一些宗旨须要是如出一辙的:标识符的命名必须清晰明了,含义鲜明,尽量少地选用缩写;严禁使用无意义的单个字母如a,
b, i, m, n或然func1, fun等华而不实的单词或缩写用于命名;

1.文本头表达

/*fileName
======================================================================
模块名 :<模块名称>
文件名 :<文件名>
实现功能:<描述该文件实现的主要功能> 
作者  :<作者部门和姓名>
版本  :<当前版本号>
创建日期:
备注  :<其它说明>
修改日期:<日期格式:yyyy-mm-dd>
修改人 :<修改人>
修改内容:<修改内容>
======================================================================
fileName*/

(1)常量、变量、函数命名:

对于变量名和函数名,经常比较常用的有两种命名法:驼峰命名法和下划线命名法,那三种方法的平昔差异在于通过什么的章程来分隔标识符命名中的逻辑断点。
驼峰命名法:通过轻重写字母的变迁举办分隔,如:int imgWidth = 0; char
*studentName = “Jerry”;
下划线命名法:通过下划线进行分隔,如:double earth_moon_distance;

对此函数名和变量名,一般可以动用不一致的命有名的模特式,不过急需专注的是只要选定的命名规范就要从头到尾保持不变。平时,我个人的习惯是,变量名和布局体名使用驼峰命名法,变量名用小写初始,结构体用大写开头;函数名使用下划线命名法,公有API以大写字母先导,私有函数以小写起来并宣称为static类型。

此外,对于常量、结构体成员变量、全局变量,还是能参考匈牙利(Hungary)命名法的规则,在变量名前投入前缀c_、m_和g_。

2.方式求证

/**
 *  <#Description#>
 *
 *  @param task    <#task description#>
 *  @param arrange <#arrange description#>
 *
 *  @created by 谢躜 on 2015-01-21 09:30:19
 */

(2)宏定义命名

对此宏定义的命名,一律全部行使大写字母,逻辑断点采取下划线分隔,如
#define MAX_ARRAY_LENGTH 256
对此头文件爱慕效率的宏定义,则以头文件的文本名命名,逻辑断点和增添名前的点全部用下划线替代,并且在第二位各增进二个下划线,如

//ImageProcessing.h
#ifndef _IMAGE_PROCESSING_H_
#define _IMAGE_PROCESSING_H_

/*code*/

#endif

3.头文书的引用表达

在h文件中引用其余类用@class fileName
在m文件中引用其余类都用#import “fileName.h

(3)标签名

常见标签名协作goto语句一起行使。由于goto本来就是相比较冷门的话语,标签也不是很常用。若是运用,则全体采取小写字母,并且在结尾加_label,如:

void test()
{
     /*code*/
     goto end_label;
     /*code*/

end_label:
     /*code*/     
}

4.文件的协会结构

文档结构 .png

参照 coding ios 客户端源码规范

    ├── Coding_iOS
    │   ├── Models:数据类
    │   ├── Views:视图类
    │   │   ├── CCell:所有的CollectionViewCell都在这里
    │   │   ├── Cell:所有的TableViewCell都在这里
    │   │   └── XXX:ListView(项目、动态、任务、讨论、文档、代码)和InputView(用于聊天和评论的输入框)
    │   ├── Controllers:控制器,对应app中的各个页面
    │   │   ├── Login:登录页面
    │   │   ├── RootControllers:登录后的根页面
    │   │   ├── MeSetting:设置信息页面
    │   │   └── XXX:其它页面
    │   ├── Images:app中用到的所有的图片都在这里
    │   ├── Resources:资源文件
    │   ├── Util:一些常用控件和Category、Manager之类
    │   │   ├── Common
    │   │   ├── Manager
    │   │   ├── OC_Category
    │   │   └── ObjcRuntime
    │   └── Vendor:用到的一些第三方类库,一般都有改动
    │       ├── AFNetworking
    │       ├── AGEmojiKeyboard
    │       ├── ASProgressPopUpView
    │       ├── ActionSheetPicker
    │       ├── FontAwesome+iOS
    │       ├── MJPhotoBrowser
    │       ├── MLEmojiLabel
    │       ├── NSDate+Helper
    │       ├── NSStringEmojize
    │       ├── PPiAwesomeButton
    │       ├── QBImagePickerController
    │       ├── RDVTabBarController
    │       ├── SMPageControl
    │       ├── SVPullToRefresh
    │       ├── SWTableViewCell
    │       ├── UMENG
    │       ├── UMessage_Sdk_1.1.0
    │       ├── XGPush
    │       ├── XTSegmentControl
    │       └── iCarousel
    └── Pods:项目使用了[CocoaPods](http://code4app.com/article/cocoapods-install-usage)这个类库管理工具

肆 、变量和结构采用正式

变量和结构的拔取是编程中最为频仍的动作,如若能正确规范变量的应用,那么对总体的编程风格的升官大有救助。
(1)变量定义之后随即起先化。经常数值型变量定今后可以立即初步化为0、有些负数或其余无意义的数值,指针变量定义后立刻先导化为NULL。那样在后边使用变量时方可更利于地看清变量是还是不是早已被科学地拍卖,幸免无意中运用了未经开首化的值。
(2)除非越发必要,否则尽量减弱全局变量的利用,对于跨文件使用的全局变量更要慎重。全局变量是造成代码之间耦合的首要因素,平常使用全局变量越来越多,代码就越难以维护。
(3)对于数值完全不该改成的量,一律定义为常量,幸免被误修改。
(4)定义3个结构体的意义应该越具体越好,不应定义一个贯彻七种功用的布局。另二个反映是,不要定义规模过分庞大的结构,那样不仅在运营时浪费系统财富,而且逻辑上麻烦精通。
(5)除非尤其须求,尽量收缩变量类型之间的威迫转换。因为强制转换实际上也是须求总结机额外操作的,过多的勒迫转换对系统财富也是一种浪费。
(6)定义结构体时注意优化成员之内的一一,尽量收缩因为字节对齐导致的储存空间浪费。

取名规则

假若想要有效的治本一个不怎么复杂一点的连串,针对内部事物的一套统一 、带层次结构、清晰明了的命名规则就是必不可少而且那么些好用的工具。
龙精虎猛在生物学、化学、军队、监狱、黑手党、恐怖社团等各类领域内的雅量有识先辈们都已经无数十次地以实际行动表明了上述公理的不错。除了上帝(设它可以变动世间万物的秩序)以外,相信没人有实力对它不屑一顾。
在软件开发这一可观抽象而且十一分复杂的位移中,命名规则的紧要更显得更为杰出。一套定义特出并且完全的、在全体项目中联合行使的命名规范将大大提高源代码的可读性和软件的可维护性。
在引入细节以前,先说美赞臣下命名规范的完好规范:

  • 同一性:
    在编排三个子模块或派生类的时候,要依据其基类或全体模块的命名风格,保持命名风格在全部模块中的同一性。
  • 标识符组成:
    标识符采用英文单词或其构成,应当直观且可以拼读,可望文知意,用词应当规范。
  • 最小化长度和最大化消息量原则:
    在保证一个标识符意思鲜明的还要,应当尽量缩小其长度。
  • 幸免过度相似:
    永不出现仅靠大小写区分的形似的标识符,例如iIfunctionFunction等等。
  • 防止在差距级其余功用域中重名:
    程序中毫无出现名字完全相同的一些变量和全局变量,即使两岸的作用域差异而不会时有爆发语法错误,但简单使人误会。
  • 科学命名具有互斥意义的标识符:
    用科学的反义词组命名具有互斥意义的标识符,如: minValueInteger
    maxValueIntegergetName()setName()

⑤ 、函数使用正式

对于大概出现执行错误(如打开文件败北等)的函数,一律通过再次回到值再次来到错误码,且错误码用宏定义预先定义好。
除非专门用来统筹输出随机音信的函数,全部的函数都应当是可预测的,即一律的输入永远爆发相同的输出。
2个函数只完结3个较小的意义,幸免出现二个完毕大气不相干效率的超长函数。
严刻分裂输入和输出参数,对于函数体中不该改变的参数全体宣称为const类型。
在函数正式开班展开拍卖以前,检查输入参数以及任何应用的表面的管事。
避免拔取过长的参数表,可以把相关的参数封装成二个结构体并以该结构体作为参数。

http://www.bkjia.com/Cyy/1117835.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1117835.htmlTechArticle理解C语言——从小菜到大神的晋级之路(15)——完结篇:C编程风格
有人说过:程序源代码其实是跟人阅读的,只是刚刚机器可以编译而…

5. h,m,nib文件名命名

除了尤其类等个别情形(不愿意被用户作为二个平淡无奇的、不荒谬的类之情形)外,iphone的h,m,nib文件名命名应该依照以下规则:

(1) h,m,nib文件名命名的称呼都要以大写字母先河;

(2)
假若是形似的视图控制器,则前边加上ViewController,即h,m,nib文本名的称号仿效分别为:

***ViewController.h
***ViewController.m
***ViewController.xib

(3)假若是自定义的视图类,则前边加上对应的品种,

UITableViewCell 简写为 Cell,UICollectionViewCell 简写为CCell

h,m,nib文件名的名号仿效分别为:

***View.h、
***View.m、
***View.xib;

***Cell.h、
***Cell.m、
***Cell.xib;

***CCell.h、
***CCell.m、
***CCell.xib;

6. 变量

(1)持有变量名命名的称谓都要以小写字母初叶。

(2)类中定义变量名称:其重点格式为***+对象类所在的名称,如给UITextFiled取名,则要写成***TextField、如valueTextFiledtitleTextField等,相应的UILabel的命名有valueLabeltitleLabel等,UITableView则要写成valueTableView等。其规则也同样适用于NSArray、NSMutableDictonary等具备项目;
除此以外,假诺当前变量是自个儿类中使用,则要在后头加上下划线,如valueArray_等,而在质量中定义时用valueArray。

(3)全局变量全体以单词_global起来,以项目结尾,如_global***TextField_global***String等。

(4)分子变量。在变量前边加上下划线_

   UIButon * _cancelButton;

(5)其间NSMutaleArray、NSMutableDictonary与NSArray、NSDictonary的最后相同,分别为Array及Dict,不做区分。

7. 方法

(1)抱有办法名命名的称谓都要以小写字母开端,要求语义完整清楚,不要乱用简写。

(2) 在ViewController中,2个控件只怕有两个事件
即使是事件的称呼,则要先以对象名称加上对象的轩然大波,如

UIButton *nameButton;

#program mark - Event
//默认情况下 EventTouchUpInside 我们简写成 Pressed
- (IBAction) nameButtonPressed:(id)sender;
//EventTouchDown
- (IBAction) nameButtonTouchDown:(id)sender;

(3) Action。
尽管是在一个视图类中,一个控件的风浪相对于这么些视图类来说只是视图类的二个事变,则不须要以控件对像名称加上对像事件命名。
而是依据视图类来命名。

@interface AbstractActionSheetPicker : NSObject
@end


UIBarButtonItem *sysDoneButton = [self createButtonWithType:UIBarButtonSystemItemDone target:self
                                                             action:@selector(actionPickerDone:)];


UIBarButtonItem *sysCancelButton = [self createButtonWithType:UIBarButtonSystemItemCancel target:self
                                                               action:@selector(actionPickerCancel:)];


- (IBAction)actionPickerDone:(id)sender
{

}

- (IBAction)actionPickerCancel:(id)sender
{

}

8. 宏

宏全体用小写,并且用须要的下划线分开,如

#define NAME_VALUE  @"dddd"
#define MAXSIZE     30

9. 常量

常量用字母 k 初阶, 如

static const NSUInteger kUsernameRow = 0;

10. 代码风格

代码风格与版式代码风格的最首要怎么强调都不过分。一段稍长一些的无格式代码基本上就是不行读的。
先来看一下这地方的共同体规范:

  • 空行的运用
    空行起着分隔程序段落的功效。空行得体(可是多也不过少)将使程序的布局越发鲜明。空行不会浪费内存,纵然打印带有空行的先后是会多损耗一些纸张,不过值得。所以不用舍不得用空行。
    那里不做规定,视自身的作风而定
  • 讲话与代码行
    一行代码只做一件工作,如只定义多少个变量,或只写一条语句。那样的代码不难阅读,并且有利于于写注释。
    “if”、“for”、“while”、“try”、“catch”等语句自占一行,执行语句不得紧跟其后。不论执行语句有微微都要加
    “{ }” 。那样可以防患书写和改动代码时出现失误。
  • 缩进和对齐
    次第的分界符 “{” 和 “}” 的格式如下所示:

while(1){
    //statement
    for(int i=0;i<=n;i++){
        //statement
    }
}

以上风格是预订风格,而上边风格则不提倡。

while(1)
{
    //statement
    for(int i=0;i<=n;i++)
    {
        //statement
    }
}

“{ }” 之内的代码块在 “{”
左边壹个制表符(几个半角空格符,直接按键盘上的Tab键来进展控制)处左对齐。

  • 最大尺寸
    代码行最大尺寸宜控制在七十六个字符以内。代码行不要过长,否则眼睛看不东山再起,也不便利打印。然则此规则可以视情况相当放宽。

  • 空格的拔取
    第三字之后要留空格。象NSInteger等重点字之后至少要留二个空格;
    其它的不做必要,如for语句里面的几条语句、&&、||等。

  • 修饰符的职责
    为方便精通,应当将修饰符 “*” 和 “&”
    紧靠变量,例如NSString *testStringNSArray *testArray

  • 注释
    诠释的岗位应与被描述的代码相邻,可以放在代码的上面或右手,不可放在下方。
    边写代码边注释,修改代码同时修改相应的笺注,以保险注释与代码的一致性。不再实用的诠释要去除。
    表明应当规范、易懂,幸免注释有二义性。错误的注释不但无益反而损害。
    当代码相比较长,越发是有多重嵌套时,应当在一些段子的终止处加注释,便于阅读。对于作业逻辑,常用的枚举数据,或者代码对应的参数毫无疑问要有认证,如

/**
 *  设置类型
 *
 *  @param type  类型 0 公有,1 私有
 *
 *  @created by 谢躜 on 2015-01-21 18:47:24
 */
- (void)setType:(NSInteger)type
{
    if(0 == type){
        //当类型为公有的时候
        ...
    }else if (1 == type){
        //当类型为私有的时候
        ...
    }
}

11. h文件协会

类 interface h文件中分头依次列出属性方法

#import <UIKit/UIKit.h>

@interface DateilViewController : UIViewController
{
    //变量
    NSString *_dataString;
}


//属性
@property (nonatomic, strong) NSDictionary *supplyDateilDict;
@property (nonatomic, strong) NSMutableArray *supplyArray;

//方法
- (void)handleData;
- (void)createView;


@end

协议 protocol ,依次列出 @required,@optional

@protocol UITableViewDataSource<NSObject>

@required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

@optional

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

// Editing

// Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

// Moving/reordering

// Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

// Index

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))

// Data manipulation - insert and delete support

// After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change
// Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

// Data manipulation - reorder / moving support

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

@end

12. m文件协会

ViewController

/*Class 的生命周期
* Class 生命周期回调方法放在最前面
*/
#pragma mark - Lifecircle

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{  
}

- (void)viewDidLoad
{  
}

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

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

- (void)didReceiveMemoryWarning
{
}

- (void)dealloc
{
}

/* 所有的控件事件放在生命周期后面
* 包括 Event ,Action,Notifation
* 如果是相近的方法用program mark 分类。排在一起。 
*/
#pragma mark - Event
- (void)backAction
{
}

- (void)selectTabbarButton:(UIButton *)sender
{
}

+ (void)reachabilityChanged:(NSNotification *)note
{
}

#pragma mark KeyBoardNotify
- (void)keyboardWillChange:(NSNotification *)note
{
}


- (void)keyboardShowNotify:(NSNotification *)note
{

}
//键盘隐藏调整界面
- (void)keyboardHideNotify:(NSNotification *)note
{

}

/*其它方法分为两部分, 
* 第一部分是数据模型操作相关的方法
* 第二部分为视图,控件相关操作 
*/
#pragma mark - Fouction

#pragma mark - HandleModal
- (void)getSupplyDateilData 
{
}

// 时间转换
- (NSString *)showTimeWithValue:(NSTimeInterval)time 
{   
}



//添加一个安排
- (void)addArrange
{
}


#pragma mark  HandleView
- (void)creatDateilView
{

}
// 显示土地信息
- (void)creatDateilInformationView
{

}

- (void)createAdvertisementView 
{ 
}

/*
* 其它协议,委托,数据源方法没有固定顺序,用到了就加到后面
*/


#pragma mark -UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  }


#pragma mark -UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

}