iOS开发规范(Objective-C版)

  1. 关于命名
     1> 统一要求
    • 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释
    • 使用全称,不适用缩写
     2> 类的命名
    • 大驼峰式命名:每个单词的首字母都采用大写字母
       例子:MFHomePageViewController
    • 后缀要求
      ViewController: 使用ViewController做后缀
     例子: MFHomePageViewController
    View: 使用View做后缀
    例子: MFAlertView
    UITableCell:使用Cell做后缀
    例子: MFNewsCell
    Protocol: 使用Delegate或者DataSource作为后缀
    例子: UITableViewDelegate
    UI控件依次类推
    3> 方法命名
    • 小驼峰式命名,每一段都以小写字母开头,后面的单词首字母大写
    • 要符合英语语法,使方法名简单干练,便于理解,语义通顺
    正确示例:
  • (NSInteger)heightOfAttributedString:(NSAttributedString *)attributedString byLimitWidth:(CGFloat)limitWidth;
    错误示例:
  • (NSInteger)getAttributedStringHeightWithString:(NSAttributedString )string widthValue:(int)width;
    4> 私有变量
    • 小驼峰式命名:第一个单词以小写字母开始,后面的单词的首字母全部大写
      例子:firstName、lastName
    • 以 _ 开头,第一个单词首字母小写
      例子:NSString * _somePrivateVariable;
    • 私有变量放在 .m 文件中声明 
     5> property变量
    • 小驼峰式命名
       例子:
    /
    *
    用户名
    */
    @property (nonatomic, copy) NSString *userName;
    • 禁止使用synthesize关键词
     6> 宏命名
    • 全部大写,单词间用 _ 分隔。[不带参数]
      例子: #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
    • 以字母 k 开头,后面遵循大驼峰命名。[不带参数]
      例子:#define kWidth self.frame.size.width
    • 小驼峰命名。[带参数]
    例子:

define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]

7> Enum
• Enum类型的命名与类的命名规则一致
• Enum中枚举内容的命名需要以该Enum类型名称开头
  例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
8> Delegate命名
• 当另一个对象中可能用到该类的多个实例时,类的实例必须为回调方法的参数之一, 如

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    • 回调方法的参数只有类自己的情况,方法名要符合实际含义, 如:
    • (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      • 以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的, 如:
    • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      • 充分利用动词的不同时态例如did和will通知Delegate已经发生的变化或将要发生的变化, 如:
        - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
  1. 私有方法、属性及变量声明
     1> 声明位置
    在.m文件中最上方。如果需要显示到头文件,可以使用@private进行修饰。
       例子1:

import "ViewController.h"

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

@implementation ViewController {
// 声明私有变量
}
例子2:
@interface ViewController : UIViewController {
@private
NSString *name;
}

  1. 关于注释
     最好的代码是不需要注释的 尽量通过合理的命名
     良好的代码把含义表达清楚 在必要的地方添加注释
     注释需要与代码同步更新
     如果做不到命名尽量的见名知意的话,就可以适当的添加一些注释或者mark
     1> 属性注释和方法声明注释
    使用系统自带的“option+command+/”
    /**
    代理方法

@param personID 登录ID
@param password 密码
@param completeHandler 完成回调
*/

  • (void)loginWithPersonID:(NSString *)personID password:(NSString *)password completeHandler:(void (^)(checkLogon *result))completeHandler;
  1. 关于UI布局
     推荐使用纯代码写UI,方便其他人修改和理解。除了UITableViewCell,这个类使用xib具有一定的优势。
     Xib文件的命名与其对应的.h文件保持相同
     Xib文件中控件的组织结构要合理,Xib文件中控件需要有合理的可读性强的命名,方便他人理解
  2. 格式化代码
     1> 指针 "" 位置
      定义一个对象时,指针 "
    " 靠近变量
       例子: NSString *userName;
     2> 方法的声明和定义
    在 - 、+ 和 返回值 之间留一个空格,方法名和第一个参数之间不留空格
  • (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {

    }

3> 代码缩进
• 使用 xcode 默认缩进,即 tab = 4空格
• 使用 xcode 中 re-indent 功能定期对代码格式进行整理
• 相同类型变量声明需要独行声明
例子:
CGFloat oringX = self.view.frame.origin.x;
CGFloat oringY = self.view.frame.origin.y;
CGFloat lineWidth = self.view.frame.size.width;
• Method与Method之间空一行
例子:
@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    }

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }
     4> 对method进行分组
      使用 #pragma mark - 方式对类的方法进行分组
    例子:

pragma mark – 私有方法

  • (void)samplePrivateMethod {
    //...
    }

  • (void)sampleForIf {
    //...
    }

  • (void)sampleForWhile {
    //...
    }

  • (void)sampleForSwitch {
    //...
    }

  • (void)wrongExamples {
    //...
    }

pragma mark – 公有方法

  • (void)samplePublicMethodWithParam:(NSString*)sampleParam {
    //...
    }

pragma mark – 生命周期

  • (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    //...
    }

  • (void)viewDidLoad {
    //...
    }

  • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //...
    }
     5> 大括号写法
    • 左括号在方法名后隔一个空格
    例子:

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    }
    • 任何需要写大括号的部分,不得省略
      错误示例:

  • (void)wrongExamples {
    BOOL someCondition = YES;
    if (someCondition)
    NSLog(@"this is wrong!!!");
    while(someCondition)
    NSLog(@"this is wrong!!!");
    }
    6> 警告
    • 需要添加警告的地方写上warning和注释,在编译的过程中会注意到
    示例:

  • (void)goBack {

warning 待完善

}
• 对于过期的方法、类、结构体和枚举等,使用系统自带的deprecated系列和NS_UNAVAILABLE
方法警告。

  1. 目录格式
    1> 根据项目的功能从大块到小块对文件用不同的文件夹进行分装;
    2> 按照项目的功能进行分类的,文件夹用中文命名;
    3> 按照代码的功能进行分类的,文件夹可以用英文或中文命名;
    4> 第三方库和工具单独存放到一个文件夹;
    5> 根据情况,小尺寸图片统一放到Assets.xcassets,同样用文件夹分类存放;
    6> 其他图片,尤其是大图,要放在boundle里,一般放在“/Resources/图片/”里;
    7> 通用的类,根据视图、模型和控制器的分类用不同文件夹分类存放;
    8> 具体到某一个小模块,则根据MVC对文件进行分类。
  2. git代码管理
    1> 先更新,再提交;
    2> 提交的时候带上自己的名字,干了什么就写什么,不得遗漏;
    3> 有重要的提交,要通知一下其他组员;
    4> git分支用版本号作为后缀。
  3. 其他细节
    1> 在Runtime+KVC面前成员变量没有公私之分,建议全部使用@property声明属性,“私有变量”的放在.m文件中的extension中声明即可,.h文件中公开的属性应合理使用readonly修饰。使用@property还有个优势,方便内存管理,规避循环引用;
    2> 控制器类中的代码尽量不要超过500行,借助继承、多态、封装三大特性和MVC、MVVM思想简化、拆分代码;
    3> 避免使用left、right、123等字样进行View控件命名,以免后续的UI修改导致命名冲突;
    4> 声明UIView及其子类属性尽量用weak修饰;
    5> ARC环境下声明NSArray/NSDictionary/NSString属性,用copy;声明前三者可变子类属性用strong;
    6> 拥有相同功能的类封装成父类;
    7> control+i 组合键,自动对齐;
    8> MJRefresh、AFNetworking在迭代过程中都出现过修改方法名的情况,比较成熟的解决方案是创建桥梁分类,封装常用的方法。如果第三方库出现命名修改,只要修改桥梁分类中的内容即可,不用每个类都去改方法,节省大量时间。这种解耦思想同样适用于NSTimer,能主动解除循环引用。详情见[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自释放定时器];
    9> 尽量不要在预编译头文件里引入太多文件,尽量精简;
    10> 分类(category)根据功能进行分类和命名;
    11> 图片命名根据模块(子模块)功能进行命名;
    12> 注意对象的内存释放问题,防止循环引用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 转载自:http://www.cocoachina.com/ios/20150508/11780.html,仅仅个...
    前进的码农阅读 715评论 0 1
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,640评论 1 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,007评论 3 38
  • 没有人可以完全信任,包括你自己 人性是丑陋的 是贪婪的 更是自私的 在生活这条路上,你会遇到许许多多的人,也许是志...
    七曜Seven阅读 245评论 0 0