iOS开发规范-ObjectiveC

一、命名规范    

 1.类的命名   

      1.1 大驼峰式命名:每个单词的首字母都采用大写字母       

           例子:MLHomePageViewController    

     1.2 前后缀要求          

          自定义控件 使用公司 ML 前缀 ,       

          ViewController: 使用ViewController做后缀        

          例子: MLHomeViewController                  

          View: 使用View做后缀        

          例子:MLAlertView       

          UITableCell:使用Cell做后缀        

         例子:MLNewsCell        

          Protocol: 使用Delegate或者DataSource作为后缀        

         例子:UITableViewDelegate        

          UI控件依次类推 ScrollView,TextField, TextView 

  2.property变量    

      2.1 小驼峰式命名:第一个单词以小写字母开始,后面的单词的首字母全部大写

     例子:@property (strong, nonatomic) NSString *userName;    

      2.2 控件命名:统一以全称后缀命名的方式:    

      例如        Button loginButton        Label userNameLabel        TextField passwordTF        TextView commentTextView                                          TableView historyTableView        ScrollView scrollView    

  3.宏命名    

      3.1 全部大写,单词间用 _ 分隔。    

      例子:#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"    

      3.2 宏的位置要在import下面,@interface 的上面    

   4.枚举    

      4.1 Enum类型的命名与类的命名规则一致   

      4.2 Enum中枚举内容的命名需要以该Enum类型名称开头      

      4.3 使用 typedef NS_ENUM 定义 与swift兼容    

          例子:       

            typedef NS_ENUM (NSInteger, AFNetworkReachabilityStatus) {             

                           AFNetworkReachabilityStatusUnknown                    = -1,             

                          AFNetworkReachabilityStatusNotReachable             = 0,            

                          AFNetworkReachabilityStatusReachableViaWWAN  = 1,           

                         AFNetworkReachabilityStatusReachableViaWiFi       = 2       

                     };   

    5.Class中方法命名       

        使用小驼峰规则,用动词命名,第一个单词的首字母小写,其他单词的首字母大写。以下为几种常用方法的命名:       

       5.1 弹出提示框或者提示信息,命名以 show 开头,

         例:showHUD      

       5.2 按钮点击方法,命名以 控件名+Clicked 结尾,

         例:loginBtnClicked     

       5.3 设置方法,命名以 set 开头,

        例:setData     

        5.4 具有返回值的获取方法,命名以 get开头,

        例:getData     

       5.5 通过异步加载数据的方法,命名以 load(本地数据)/query/request(请求网络数据) 开头,

           例:loadData       

       5.6 布尔型的判断方法,命名以 is 或 has,或具有逻辑意义的单词如 equals,

           例:isEmpty     

       5.7 保存数据相关的方法,命名以 save 开头,

           例:saveGoodsData,     

       5.8 对数据重组的方法,命名以 reset 开头,

           例:resetOrderData,

       5.9 清除数据相关的方法,命名以 clear/clean/remove 开头,

            例:clearUserData,    

    6. Delegate方法命名     

        6.1 类的实例必须为回调方法的参数之一, 如         

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

        6.2 回调方法的参数只有类自己的情况,方法名要符合实际含义, 如:          

         - (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView      

       6.3 以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的, 如:         

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

       6.4 使用did和will通知Delegate已经发生的变化或将要发生的变化, 如:         

         - (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;         

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

    7. 切图命名:           

        切图命名:

       页面_模块_类别_功能_状态.png

        如:home_tab_btn_search_normal.png)

               首页_标签栏_按钮_搜索_默认状态.png

       常用英文名:

       模块:

标签栏 nav               菜单栏 tab              背景 bg                左侧导航 leftbar             启动页面 lanuch              工具栏 tool              主页面 home              列表 list

个人资料porfile        登录 login               注册 regsiter        标题 title

类别:

标志 logo                 图标ic                     按钮 btn               进度条 progress bar        默认图片 def                   分隔图片 div            图片 img                    评论 comment

广告 ad                   提示信息 msg          弹出 pop              输入框 input                    菜单 menu                      复选框 chb              单选框rb                    下拉 cbb

功能:

搜索 search            收藏 collect              时间 time               音频 audio                      视频 viedio                    用户 user                排名 ranked                关闭 close

返回 back                编辑 eidt                 删除 delete            链接 link                         下载 download               注释 note                刷新 refresh                取消 cancel

设置 setting

        状态:

默认 normal(nor)              按下 pressed              选中 selected(sel)              不可点击 disabled(dis)

    8. 关于UI布局     

       8.1 使用Interface Builder进行界面布局      

       8.2 Xib文件的命名与其对应的.h文件保持相同      

       8.3 Xib或SB文件中控件的必须进行重命名,不允许出现Label ImageView等Xcode缺省命名。 

二、类中代码规范    

     1. import规范      

       当一个Controller或者一个Class中需要用到不同的类和Define时, 我们应当把#import划分.      

       划分原则: 哪个Controller或者Class是本Controller或者Class的次级就放在一起, 公共Controller或Class就与之前的空一行, 紧跟着下面.      

     分隔 用 #pragma mark-

       // controller

       #import "TripDetailViewController.h"

       #import "TripEvaluationViewController.h"

       #import "EvaluateViewController.h"

       #pragma mark -

       // view

       #import "HCSStarRatingView.h"

       #import "UndealTripHeader.h"

       #import "FinishedTripHeader.h"

       #import "GPMapAnnotationView.h"

      #import "GPMapDriverAnnotationView.h"

      // model&tool

       #import "GPCancelTripRequest.h"

       #import "GPGetTripDetailRequest.h"

       #import "GPWebServiceManager.h"

       #import "GPEvaluateTripRequest.h"

      (建议)需要经常使用的,新建Importer.h 文件,导入到.pch头文件中

        #import <UIKit/UIKit.h>

        #import<Foundation/Foundation>

       //百度地图

       //引入base相关所有的头文件

        #import//引入地图功能所有的头文件

        #import//引入检索功能所有的头文件

        #import//引入定位功能所有的头文件 

        #import//引入计算工具所有的头文件

        #import//只引入所需的单个头文件

        #import//猿题库网络请求框架

        #import "YTKNetworkAgent.h"

        #import "HLShadowAndCornerImageView.h"

      2. property 声明

         2.1 声明位置

          在.m文件中最上方,定义空的category进行声明,根据内存管理关键字来划分模块, 且以 "*" 分类对齐(基础数据类型除外),nonatomic 修饰放在最后。 不可在实现类中用大括号的方式申明私有变量,避免这些变量在方法中使用时,与方法的传入参数理解作用域理解混淆 例子:

#import "CodeStandardViewController.h"

// 在这个category(类目)中定义变量和方法

@interface CodeStandardViewController ()

@property (weak, nonatomic) IBOutlet UILabel            *priceLabel;

@property (weak, nonatomic) IBOutlet UIImageView        *otherInfoImageView;

@property (weak, nonatomic) IBOutlet UILabel            *tripPassengerCountLabel;

@property (strong, nonatomic) AspRetrievePasswordView  *retrievePassword;

@property (strong, nonatomic) UITextField              *foucsTextField;

@property (copy, nonatomic) NSString                    *brandName;

@property (copy, nonatomic) NSString                    *brandType;

@property (assign, nonatomic) NSInteger                zeroCount;

@property (assign, nonatomic) NSInteger                verificationCode;

@end

@implementation CodeStandardViewController

/* 错误 声明

{

NSDictionary *vcConfigDict;

BOOL isInfoViewShown;

}

/*

@end

         2.2 使用

         在.m中 以 self. 的方式使用,不使用下划线的形式

    3.方法规范

        3.1在声明函数时"-"与"(type)"必须空一格, 且后面的参数类型与"*"也必须空一格.多个参数冒号对齐。

/**

<#Description#>

@param result <#result description#>

@param mapView <#mapView description#>

@param error <#error description#>

*/

+ (void)showRoute:(BMKDrivingRouteResult *)result

on:(BMKMapView *)mapView

errorCode:(BMKSearchErrorCode)error;

       3.2方法与方法之间相隔一行的间距,在函数体内, 如果第一句调用的是系统方法, 可不换行, 如果是自定义的方法(包括if-else和for in), 必须换行.

+ (void)showRoute:(BMKDrivingRouteResult *)result

on:(BMKMapView *)mapView

errorCode:(BMKSearchErrorCode)error {

NSArray* overlaysArray = [NSArray arrayWithArray:mapView.overlays];

[mapView removeOverlays:overlaysArray];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

   4. if-else规范

      4.1 使用结构清晰的排版方式, if-else语句与方法名空行, return语句可以不用空行.

- (instancetype)initWithFrame:(CGRect)frame {

if (self = [super initWithFrame:frame]) {

// code body

}

return self;

}

     4.2 if-else内部也必须跟着空行, 在else之后的"}"可不空行.

- (void)viewDidLoad {

[super viewDidLoad];

if (age < 0) {

// Code Body

}

}

       4.3 if-else超过四层的时候, 就要考虑重构, 多层的if-else结构很难维护。 合理使用ifelse, 当某个场景只需满足一个条件才能进入if-else时, 应该把if-else抽成一个模块。

- (void)viewDidLoad {

[super viewDidLoad];

if (age < 0) {

NSLog(@"这是错误的年龄");

return;

}

NSLog(@"现在时%ld岁", (long)age):

}

       4.4 if-else必须加"{}"符号, 哪怕是一行判断.

   5. 运算符规范

      5.1 一元运算符和参数之间不放置空格, 比如"!"非运算符, "&"安位与, "|"安位或.

BOOL isOpen  = true;

BOOL isClose = !isOpen;

     5.2 二元运算符和参数之间要有空格, 如赋值号"="左右各留一个空格.

self.myString = @"mySring";

     5.3 三目运算符和参数之间必须得有空格, 如判断符"?"结果符":"

NSInteger userAge = @"Man" ? 18 : 19;

   6. NSDictionary

      当NSDictionary里的Key : Value过多时, 应拆分为多行显示, 并以 ":" 对齐

NSDictionary *people = @{@"xiaoming" : 18,

@"xiaohong" : 19,

@"xiaowang" : 20};

   7. NSArray(视情况)

     当NSArray里的元素过多时, 应拆分为多行显示, 并以第一个元素对齐.

     NSArray *nameArray = @[@"小明",@"小红",@"小王"];

   8. #pragma mark -

    对于相同性质的属性、方法使用 mark 分组

#pragma mark - lift cycle

#pragma mark - IBAction

   9.TODO 规范

     对于多人开发的项目,//  TODO后 必须加上作者

  10. 枚举

     项目中不允许直接使用数字代替

typedef NS_ENUM(NSInteger, TripStatus) {

TripStatusNotPublish = 0,

// 已发布

TRIP_STATUS_PUBLISHED = 10,

// 重派单

TRIP_STATUS_REDISPACH = 15,

// 已派单

TRIP_STATUS_DISPACHED = 20,

// 已接单

TRIP_STATUS_RECEIVED = 30,

// 正在接

TRIP_STATUS_PICKING = 33,

// 已接到

TRIP_STATUS_PICKEDUP = 35,

// 已出发

TRIP_STATUS_STARTED = 40,

// 已完成

TRIP_STATUS_DONE = 50,

// 已取消

TRIP_STATUS_CANCELED = -1

};

三、注释规范

     最好的代码是不需要注释的 尽量通过合理的命名

     良好的代码把含义表达清楚 在必要的地方添加注释

     注释需要与代码同步更新

    如果做不到命名尽量的见名知意的话,就可以适当的添加一些注释或者mark.

  1. 文件头

      与公司的要求统一

     1.1 必须出现 文件创建者, 创建日期,创建者联系方式

//

//  UserCenterViewController.h

//  GuaGuaPassenger

//

//  Created by Wang Hai Long (wanghailong096@sunfit.cn) on 10/10/2016.

//  Copyright © 2016 Sunfit. All rights reserved.

   2. 属性注释

      例子:

    /** 学生 */

    @property (nonatomic, strong) Student *student;

   3. 方法声明注释:

      以下情况必须加注释

     3.1 接口中定义的所有方法

     3.2 抽象类中自定义的抽象方法

     3.3 抽象父类的自定义公用方法

     3.4 工具类的公用方法

    option+command+? 自动生成注释格式

/**

* @brief 登录验证

*

* @param personId 用户名

* @param password 密码

* @param complete 执行完毕的block

*

* @return

*/

+ (void)loginWithPersonId:(NSString *)personId

password:(NSString *)password

complete:void (^)(CheckLogon *result))complete;

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

推荐阅读更多精彩内容