Objective-C编码规范

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Objective-C编程规范目录例子空格与格式o空格与制表符o行宽o方法声明与定义o方法调用o@public与@privateo异常o协议命名o文件名oObjective-C++o类名o分类名oObjective-C方法名o变量名注释o文件注释o声明注释o实现注释o对象所有权Cocoa与Objective-C特性o成员变量应该为@privateo指明指定的初始化器o重写指定的初始化器o避免使用+newo保持公有的API尽量简单o#import与#includeo使用根框架o创建对象时尽量使用autoreleaseoAutorelease之后retainoDealloc中应该按声明的顺序处理成员变量oSetters中对NSString进行copyo避免抛出异常onil的检查oBOOL陷阱o属性Cocoa模式o委托模式o模型-视图-控制器背景介绍Objective-C是一种动态的面向对象的语言,它是C的扩展。它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言。它是MacOSX以及iPhone的主要开发语言Cocoa是MacOSX的主要的应用程序框架。它由一组支持MacOSX全部特性的,并可用于快速开发的Objective-C类构成。Apple'sCocoaCodingGuidelinesGoogle'sOpenSourceC++StyleGuide本文档的目的在于为所有的MacOSX的代码提供编程指南及最佳实践。许多指南是在实际的项目及小组中经过长期的演进及验证的。请注意,本指南不是Objective-C的教程。我们假定读者已经对Objective-C非常熟悉。如果你刚刚接触Objective-C或者需要提高,请阅读TheObjective-CProgrammingLanguage。例子一个例子顶上一千句话,我们就从这样的一个例子开始,来感受一下编码的风格、空格以及命名等等。一个头文件的例子,展示了在@interface声明中如何进行正确的注释以及空格。//GTMFoo.h//FooProject////CreatedbyGregMilleron6/13/08.//Copyright2008Google,Inc.Allrightsreserved.//#importfoundation/foundation.h//AsampleclassdemonstratinggoodObjective-Cstyle.Allinterfaces,//categories,andprotocols(read:alltop-leveldeclarationsinaheader)//MUSTbecommented.Commentsmustalsobeadjacenttotheobjectthey're//documenting.////(noblanklinebetweenthiscommentandtheinterface)@interfaceGTMFoo:NSObject{@privateNSString*foo_;NSString*bar_;}//ReturnsanautoreleasedinstanceofGMFoo.See-initWithString:fordetails//abouttheargument.+(id)fooWithString:(NSString*)string;//Designatedinitializer.|string|willbecopiedandassignedto|foo_|.-(id)initWithString:(NSString*)string;//Getsandsetsthestringfor|foo_|.-(NSString*)foo;-(void)setFoo:(NSString*)newFoo;//Doessomeworkon|blah|andreturnsYESiftheworkwascompleted//successfuly,andNOotherwise.-(BOOL)doWorkWithString:(NSString*)blah;@end/foundation一个实现文件的例子,展示了@implementation部分如何进行正确的注释、空格。同时也包括了基于引用实现的一些重要方法,如getters、setters、init以及dealloc。////GTMFoo.m//FooProject////CreatedbyGregMilleron6/13/08.//Copyright2008Google,Inc.Allrightsreserved.//#importGTMFoo.h@implementationGTMFoo+(id)fooWithString:(NSString*)string{return[[[selfalloc]initWithString:string]autorelease];}//Mustalwaysoverridesuper'sdesignatedinitializer.-(id)init{return[selfinitWithString:nil];}-(id)initWithString:(NSString*)string{if((self=[superinit])){foo_=[stringcopy];bar_=[[NSStringalloc]initWithFormat:@hi%d,3];}returnself;}-(void)dealloc{[foo_release];[bar_release];[superdealloc];}-(NSString*)foo{returnfoo_;}-(void)setFoo:(NSString*)newFoo{[foo_autorelease];foo_=[newFoocopy];}-(BOOL)doWorkWithString:(NSString*)blah{//...returnNO;}@end空格与格式空格与制表符我们使用空格进行缩进。不要在代码中使用制表符。你应该将你的文本编辑器设置成自动将制表符替换成空格。总结:只使用空格,每次缩进四个空格。行宽即使Objective-C比C++更加冗长,为了保证本指南的可操作性,我们决定保持每行宽度为80列。这比你想的要简单。我们意识到这条规则是有争议的,但很多已经存在的代码坚持了本规则,因此我们觉得保证一致性更重要。通过设置XcodePreferencesTextEditingShowpageguide,来使越界更容易被发现。总结:代码中的每行最多有80个字符。方法声明与定义方法应该像这样-(void)doSomethingWithString:(NSString*)theString{...}星号前的空格是可选的(统一要求加空格)。当写新的代码时,要与原的代码一致。如果一行有非常多的参数,更好的方式是将每个参数单独拆成一行。如果使用多行,将每个参数前的冒号对齐。-(void)doSomethingWith:(GTMFoo*)theFoorect:(NSRect)theRectinterval:(float)theInterval{...}当第一个关键字比其它的短时,保证下一行至少有4个空格的缩进。这样可以使关键字垂直对齐,而不是使用冒号对齐:-(void)short:(GTMFoo*)theFoolongKeyword:(NSRect)theRectevenLongerKeyword:(float)theInterval{...}总结:-或者+与返回类型之间,需要有空格。参数列表中,只有参数之间有空格。方法调用方法调用时,所有参数应该在同一行。[myObjectdoFooWith:arg1name:arg2error:arg3];或者每行一个参数,以冒号对齐:[myObjectdoFooWith:arg1name:arg2error:arg3];不要使用下面的缩进风格:[myObjectdoFooWith:arg1name:arg2//somelineswith1argerror:arg3];[myObjectdoFooWith:arg1name:arg2error:arg3];[myObjectdoFooWith:arg1name:arg2//aligningkeywordsinsteadofcolonserror:arg3];方法定义与方法声明一样,当关键字的长度不足以以冒号对齐时,下一行都要以四个空格进行缩进。[myObjshort:arg1longKeyword:arg2evenLongerKeyword:arg3];总结:方法定义的格式与方法声明的格式非常相似。当格式的风格有多种选择时,新的代码要与已经存在的代码保持一致。@public与@private与C++中的public,private以及protected非常相似。@interfaceMyClass:NSObject{@public...@private...}@end总结:@public以及@private访问标识符应该以一个空格缩进。异常如果你必须使用Objective-C的异常,按下面的格式进行编码代码。然后,请参见避免抛出异常来了解不应该使用异常的原因。@try{foo();}@catch(NSException*ex){bar(ex);}@finally{baz();}总结:每个@标签应该有独立的一行,在@与{}之间需要有一个空格。@catch与被捕捉到的异常对象的声明之间也要有一个空格。协议这条规则也同样适用于类声明、成员变量以及方法声明。例如:@interfaceMyProtocoledClass:NSObjectnswindowdelegate{@privateidmyfancydelegatedelegate_;}-(void)setDelegate:(idmyfancydelegate)aDelegate;@end/myfancydelegate/myfancydelegate/nswindowdelegate总结:尖括号所包括的协议名称与前面的类型标识之间不应该有空格。命名对于可维护的代码,命名规则非常重要。Objective-C的方法名往往十分长,但代码块读起来就像散文一样,不需要太多的注释修饰。当编写纯Objective-C代码时,我们基本遵守标准的Objective-Cnamingrules,这些命名规则可能与C++风格指南中的大相径庭。例如,Google的C++风格指南中推荐使用下划线分隔的单词作为变量名,而(苹果的)风格指南则使用camel命名法,这在Objective-C社区中非常普遍。任何的类、分类、方法以及变量的名字中都使用全大写缩写。这遵守了苹果的标准命名方式,如URL、TIFF以及EXIF。当编写Objective-C++代码时,事情就不这么简单了。许多的项目需要实现跨平台的C++代码,并与Objective-C以及Cocoa混合编写。或者以C++作为后端,Cocoa作为前端。这就导致了两种命名方式直接不统一。我们的解决方案是:编码风格取决于方法/函数以哪种语言实现。如果在一个@implementation语句块中,就使用Objective-C的风格。如果实现一个C++的类,请使用C++的风格。这避免了成员变量与局部变量使用混合的命名风格,这会严重地影响可读性。文件名文件的扩展名应该如下:.h,C/C++/Objective-C的头文件.m,Ojbective-C实现文件.mm,Ojbective-C++的实现文件.cc,纯C++的实现文件.c,纯C的实现文件分类的文件名应该包含被扩展的类的名字,如:GTMNSString+Utils.h或GTMNSTextView+Autocomplete.h。总结:文件名应该反映了它实现了什么类。遵守你的项目的惯例。Objecti

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功