关于iOS编码规范

一.代码命名

一般性原则

最好是既清晰又简短,但不要为简短而丧失清晰性。

例如:removeObject:AtIndex:good

remove不清晰;要移除什么?

名称通常不缩写,即使名称很长,也要拼写完全。

例如:setBackgroundColor:good

setBgColor:不清晰

方法命名

1.一般性规则

小写第一个单词的首字母,大写随后单词的首字母,不使用前缀。

有两种例外情况:1,方法名以广为人知的大写字母缩略词(如PDF)开头;2,私有方法可以使用统一的前缀来分组和辨识。

表示对象行为的方法,名称以动词开头:

-(void)removeAllObjects;

名称中不要出现do或does,因为这些助动词没什么实际意义。也不要在动词前使用副词或形容词修饰。

如果方法返回方法接收者的某个属性,直接用属性名称命名。不要使用get,除非是间接返回一个或多个值。

例如:-(NSSize)cellSize;对

- (NSSize)getCellSize;错

参数要用描述该参数的关键字命名

-(void)sendAction:(SEL)aSelector to:(id)anObject

forAllCells:(BOOL)flag;对

-

(void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;错

参数前面的单词要能描述该参数。

-(id)viewWithTag:(int)aTag;对

-(id)taggedView:(int)aTag;错

不要使用and来连接用属性作参数关键字

- (int)runModalForDirectory:(NSString *)pathfile:(NSString *)name types:(NSArray *)fileTypes;对

- (int)runModalForDirectory:(NSString *)pathandFile:(NSString *)name andTypes:(NSArray *)fileTypes;错

如果方法描述两种独立的行为,使用and来串接它们

- (BOOL)openFile:(NSString *)fullPathwithApplication:(NSString *)appName andDeactivate:(BOOL)flag;

2.访问方法

访问方法是对象属性的读取与设置方法。其命名有特定的格式依赖于属性的描述内容。

如果属性是用名词描述的,则命名格式为:

-(type)noun;

-(void)setNoun:(type)aNoun;

如果属性是用形容词描述的,则命名格式为:

-(BOOL)isAdjective;

-(void)setAdjective:(BOOL)flag;

如果属性是用动词描述的,则命名格式为:(动词要用现在时时态)

-(BOOL)verbObject;

-(void)setVerbObject:(BOOL)flag;

不要使用动词的过去分词形式作形容词使用

-(void)setAcceptsGlyphInfo:(BOOL)flag;Right

-(BOOL)acceptsGlyphInfo;Right

-(void)setGlyphInfoAccepted:(BOOL)flag;Wrong

-(BOOL)glyphInfoAccepted;Wrong

可以使用情态动词(can,

should, will等)来提高清晰性,但不要使用do或does。

只有在方法需要间接返回多个值的情况下,才使用get

-(void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;

3.委托方法

委托方法是那些在特定事件发生时可被对象调用,并声明在对象的委托类中的方法。它们有独特的命名约定,这些命名约定同样也适用于对象的数据源方法。

名称以标示发送消息的对象的类名开头,省略类名的前缀并小写类第一个字符

-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;

冒号紧跟在类名之后(随后的那个参数表示委派的对象)。该规则不适用于只有一个sender参数的方法,也不适用于响应通知的方法,在这种情况下,方法的唯一参数表示通知对象。

用于通知委托对象操作即将发生或已经发生的方法名中要使用did或will

-(NSUndoManager *) windowWillReturnUndoManager:(NSWindow *)window;

用于询问委托对象可否执行某操作的方法名中可使用did或will,但最好使用should

-(BOOL)windowShouldClose:(id)sender;

4.方法参数

命名方法参数时要考虑如下规则:

如同方法名,参数名小写第一个单词的首字符,大写后继单词的首字符。应选择与方法名连在一起读起来通顺的参数名。

如:removeObject:(id)anObject

不要在参数名中使用pointer或ptr,让参数的类型来说明它是指针

避免使用one, two,...,作为参数名

避免为节省几个字符而缩写

实例变量与常量

声明属性和实例变量

如果属性是用一个名词或动词描述的,格式是:

@property(…) type nounOrVerb;

例如:@property (strong) NSString *title;

@property (assign) BOOLshowsAlpha;

如果声明的属性是用一个形容词描述的,并且属性名称省略了”is”前缀,则指定其getter方法。

例如:@property (assign, getter=isEditable) BOOL editable;

在为类添加实例变量应注意:

避免创建public实例变量

使用@private、@protected显示限定实例变量的访问权限。如果你希望你的类将被继承,而这些子类将需要直接访问数据,使用@protected指令。

常量

枚举常量

使用枚举来定义一组相关的整数常量,枚举常量也要有相应的前缀。大写前缀后紧跟的第一个单词首字母。

其他常量

使用const来修饰浮点常量或彼此没有关联的整数常量。

const常量命名范例:

const float NSLightGray;

避免在程序中直接出现常量,使用超过一次的应以宏定义的形式来替代。宏定义的命名应当能够表达出它的用途,并且用大写字母表示。

二.书写规范

1.方法声明与定义

方法中如果一行有非常多的参数,更好的方式是将每个参数单独拆成一行。如果使用多行,将每个参数前的冒号对齐。

- (void)doSomethingWith:(GTMFoo *)theFoo

rect:(NSRect)theRect

interval:(float)theInterval { ...

}

当第一个关键字比其它的短时,保证下一行至少有4个空格的缩进。这样可以使关键字垂直对齐,而不是使用冒号对齐:

-(void)short:(GTMFoo *)theFoo

longKeyword:(NSRect)theRect

evenLongerKeyword:(float)theInterval{ ...

}

-或者+与返回类型之间,需要有空格。参数列表中,只有参数之间有空格。

2.方法调用

方法调用时,所有参数应该在同一行。

[myObjectdoFooWith:arg1 name:arg2 error:arg3];

或者每行一个参数,以冒号对齐:

[myObjectdoFooWith:arg1

name:arg2

error:arg3];

与方法定义和方法声明一样,当关键字的长度不足以以冒号对齐时,下一行都要以四个空格进行缩进。

[myObjshort:arg1

longKeyword:arg2

evenLongerKeyword:arg3];

3.变量的声明

变量名必须起有意义的名字,使其它人可以很容易读懂变量所代表的意义。与方法命名一样,首字母小写。

对于一些特殊类型的变量,命名时要带上类型,如NSArray的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。千万不能将NSArray的变量命名为xxxDictionary。

成员变量使用“_”作为前缀。

三.编码的排版格式

1空格的使用

代码的缩进应使用空格(SPACE),不能使用制表符(TAB),并且缩进以2个字符为单位。

关键字与其后的表达式之间要有空格,如:if (expr)或for (expr)

单目操作符不应与它们的操作数分开(如’!’和’^’等)。

除‘,’外,其它双目操作符应与它们的操作数用空格隔开。如:

i=i+1;//错误的写法,操作符两端没有空格

i = i + 1;//正确的写法

if(a>b)//错误的写法,逻辑判断符号两端没有空格

if(a > b)//正确的写法

.h中协议<>前面有一个空格。

.h中成员声明时,类型与变量之间至少有1个空格。*号靠近变量,不靠近类型。

@property后留1个空格,()里面,逗号紧跟前一变量,与后一变量之间留1个空格。()外面,先留1个空格,再声明属性。

方法的+,-后面与()之间留1个空格。

返回类型与*之间留1个空格,方法参数中返回类型与*之间留1个空格。

在多参数方法中,每个参数后面都有1个空格。

2关于空行

1) .h中的空行

文件说明与#import之间空1行

#import之间,如果需要分类区别,各类别之间空1行。

#import与@class之间空2行。

@interface与@class之间空1行。

头文件{}里面,空1行开始声明对象成员,如果需要分类区别,各类别之间空1行。

头文件{}外,空1行书写属性,如果需要分类区别,各类别之间空1行。

属性下面空1行开始写方法,如果需要分类区别,各类别之间空1行。

方法声明完后,与@end空1行。

如果需要声明protocol,空2行接着写。通常protocol写在@end后面,但是声明在@interface之前。

2) .m中的空行

文件说明与#import之间空1行

#import之间,如果需要分类区别,各类别之间空1行。

@implementation和@synthesize之间空1行,如果需要分类区别,各类别之间空1行。

@synthesize与方法之间空1行。

方法与方法之间空1行。

3)方法里面的空行

变量声明后需要空1行,如果需要分类区别,各类别之间空1行。

条件、循环和选择语句,整个语句结束,需要空1行。

各功能块之间空1行。

最后一个括弧之前不空行。

注释与代码之间不空行。

#pragma mark与方法之间空1行。

4)每行代码最好不超过100个字符。

四.注意事项

1.BOOL

Ojbective-C中定义BOOL为无符号字符型,这意味着BOOL类型可以有不同于1或者0的值。不要直接把整形转换成BOOL。常见的错误包括将数组的大小、指针值及位运算的结果直接转换成BOOL,这取决于整型结果的最后一个字节,可能产生一个NO的值。当转换整形至BOOL时,使用三目操作符来返回YES或者NO。

对BOOL使用逻辑运算符(&&,||和!)是合法的,返回值也可以安全地转换成BOOL,不需要使用三目操作符。

错误的用法:

-(BOOL)isBold {

return[self fontTraits] & NSFontBoldTrait;}

-(BOOL)isValid {

return[self stringValue]; }

正确的用法:

-(BOOL)isBold {

return([self fontTraits] & NSFontBoldTrait) ? YES : NO;

}

-(BOOL)isEnabled {

return[self isValid] && [self isBold];

}

同样的,不要直接比较BOOL变量与YES/NO。不仅影响可读性,结果可能与你想的不同。

错误的用法:

BOOLgreat = [foo isGreat];

if(great == YES)

正确的用法:

BOOLgreat = [foo isGreat];

if(great)

2.点引用

点引用是Objective-C2.0的风格,它被使用于简单的属性set、get操作,但对象的其他行为不应该使用它。

正确的做法:

NSString*oldName = myObject.name;

myObject.name= @"Alice";

错误的做法:

NSArray*array = [NSArray arrayWithObject:@"hello"];

NSUIntegernumberOfItems = array.count;// not aproperty

array.release;// nota property

����t�#

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

推荐阅读更多精彩内容

  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,374评论 21 35
  • 转载自:http://www.cocoachina.com/ios/20150508/11780.html,仅仅个...
    前进的码农阅读 650评论 0 1
  • 搜狐视频iOS团队 Objective-C 编码规范 介绍 团队中长期以来存在各人不同的编码方式和习惯,导致代码中...
    DiligentLeo阅读 717评论 0 5
  • 推荐文章:禅与 Objective-C 编程艺 前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、...
    WolfTin阅读 2,685评论 0 1
  • 一. 概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序。关于Objec...
    雨影阅读 250评论 0 0