iOS应用开发最佳实践编写高质量ObjectiveC代码_第1页
iOS应用开发最佳实践编写高质量ObjectiveC代码_第2页
iOS应用开发最佳实践编写高质量ObjectiveC代码_第3页
iOS应用开发最佳实践编写高质量ObjectiveC代码_第4页
iOS应用开发最佳实践编写高质量ObjectiveC代码_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、iOS应用开发最佳实践:编写高质量Objective-C代码点标记语法属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法。良好的风格:view.backgroundColor=UIColororangeColor;UIApplicationsharedApplication.delegate;不良的风格:viewsetBackgroundColor:UIColororangeColor;间距二元运算符和参数之间需要放置一个空格,一元运算符、强制类型转换和参数之间不放置空格。关键字之后圆括号之前需要放置一个空格。void*ptr=&value+10

2、*3;NewTypea=(NewType)b;for(inti=0;i b ? x : y;不良的风格:result = a b ? x = c d ? c : d : y;异常和错误处理不要在流控制语句中使用异常(NSException)。异常仅用于表明程序员的错误。为了表明一个错误,使用NSError *。当一个方法通过引用返回一个错误参数,应该检测返回值的状态,而不是错误参数的状态。良好的风格:NSError*error;if(!selftrySomethingWithError:&error)/HandleError不良的风格:NSError*error;selftrySomethin

3、gWithError:&error;if(error)/HandleError在方法执行成功的情况下赋值非Null值给错误参数,会使路径跳转到假条件分支(随后程序奔溃)。代理除了继承一个类或实现一个协议,否则在头文件中仅使用类声明class指令,不用#import导入类头文件。如果一个delegate只有几个方法,比如只是提交和取消,推荐使用block编写动作响应代码。由于代理方法的声明一般都很长,所以必须将代理对象和其他的协议对象放在实例变量定义的下面,否则实例变量定义的对齐方式将会被打乱掉。当需要实现多个协议的时候,将每一个协议名拆分到单独的行。良好的风格:interfaceCustomM

4、odelViewController:TTViewController方法一个方法的命名首先描述返回什么,接着是什么情况下被返回。方法签名中冒号的前面描述传入参数的类型。以下类方法和实例方法命名的格式语法:object/classthing+condition;object/classthing+input:input;object/classthing+identifer:input;Cocoa命名举例:realPath=pathstringByExpandingTildeInPath;fullString=stringstringByAppendingString:ExtraText;ob

5、ject=arrayobjectAtIndex:3;/类方法newString=NSStringstringWithFormat:%f,1.5;newArray=NSArrayarrayWithObject:newString;良好的自定义方法命名风格:recipients=emailrecipientsSortedByLastName;newEmail=CDCEmailemailWithSubjectLine:ExtraText;emails=mailboxmessagesReceivedAfterDate:yesterdayDate;当需要获取对象值的另一种类型的时候,方法命名的格式语法如

6、下:objectadjective+thing;objectadjective+thing+condition;objectadjective+thing+input:input;良好的自定义方法命名风格:capitalized=namecapitalizedString;rate=numberfloatValue;newString=stringdecomposedStringWithCanonicalMapping;subarray=arraysubarrayWithRange:segment;方法签名尽量做到含义明确。不良的风格:-sortInfo /是返回排序结果还是给info做排序-

7、refreshTimer /返回一个用于刷新的定时器还是刷新定时器-update /更新什么,如何更新良好的风格:-currentSortInfo / current清楚地修饰了名词SortInfo-refreshDefaultTimer / refresh是一个动词。-updateMenuItemTitle /一个正在发生的动作方法类型修饰符+/-后要放置一个空格,各参数名之间也要放置一个空格。良好的风格:- (void)setExampleText:(NSString *)text image:(UIImage *)image;如果方法的命名特别长,将方法名拆分成多行。良好的风格:colo

8、r=NSColorcolorWithCalibratedHue:0.10saturation:0.82brightness:0.89alpha:1.00;不要将私有的实例变量和方法声明在头文件中,应将私有变量和方法声明在实现文件的类扩展内。不良的风格:/MyViewController.h文件interfaceMyViewController:UIViewControllerprivate:UITableView*_myTableView;/私有实例变量/内部使用的属性property(nonatomic,strong)NSNumber*variableUsedInternally;-(voi

9、d)sortName;/只用于内部使用的方法end良好的风格:/MyViewController.m文件使用类扩展interfaceMyViewController()UITableView*_myTableView;/外部需要访问的实例变量声明为属性,不需要外部访问的声明为实例变量NSNumber*variableUsedInternally;/从Xcode4.3开始,可以不写方法的前置声明,InterfaceBuilder和Storyboard仍然可以找到方法的定义end构造函数通常应该返回实例类型而不是id类型下页内容更精彩参数方法参数名前一般使用的前缀包括“the”、“an”、“new

10、”。良好的风格:-(void)setTitle:(NSString*)aTitle;-(void)setName:(NSString*)newName;-(id)keyForOption:(CDCOption*)anOption-(NSArray*)emailsForMailbox:(CDCMailbox*)theMailbox;-(CDCEmail*)emailForRecipients:(NSArray*)theRecipients;变量变量的命令应尽量做到自描述。除了在for()循环语句中,单字母的变量应该避免使用(如i,j,k等)。一般循环语句的当前对象的命名前缀包括“one”、“a/

11、an”。对于简单的单个对象使用“item”命名。良好的风格:for(i=0;icount;i+)oneObject=allObjectsobjectAtIndex:i;NSLog(oneObject:%,oneObject);NSEnumerator*e=allObjectsobjectEnumerator;iditem;while(item=enextObject)NSLog(item:%,item);指针变量的星号指示符应该紧靠变量,比如NSString *text,而不是NSString* text或NSString * text。尽量的使用属性而非实例变量。除了在初始化方法(init,

12、initWithCoder:等)、dealloc方法以及自定义setter与getter方法中访问属性合成的实例变量,其他的情况使用属性进行访问。良好的风格:interfaceRNCSection:NSObjectproperty(nonatomic)NSString*headline;end不良的风格:interfaceRNCSection:NSObjectNSString*headline;当你使用synthesize指令时,编译器会自动为你创建一个下划线_开头的的实例变量,所以不需要同时声明实例变量和属性。不良的风格:interfaceRNCSection:NSObjectNSStrin

13、g*headline;property(nonatomic)NSString*headline;end良好的风格:interfaceRNCSection:NSObjectproperty(nonatomic)NSString*headline;end不要使用synthesize除非是编译器需要。注意在protoco协议中的optional可选属性必须被显式地使用synthesize指令合成属性。缩略词虽然方法命名不应使用缩略词,然而有些缩略词在过去被反复的使用,所以使用这些缩略词能更好的的表达代码的含义。下表列出了Cocoa可接受的缩略词。.以下是一些常用的首字母缩略词ASCIIPDFXMLH

14、TMLURLRTFHTTPTIFFJPGPNGGIFLZWROMRGBCMYKMIDIFTP命名方法和变量的命令应该尽可能做到自描述。良好的风格:UIButton*settingsButton;不良的风格:UIButton*setBut;对于NSString、NSArray、NSNumber或BOOL类型,变量的命名一般不需要表明其类型。良好的风格:NSString*accountName;NSMutableArray*mailboxes;NSArray*defaultHeaders;BOOLuserInputWasUpdated;不良的风格:NSString*accountNameStrin

15、g;NSMutableArray*mailboxArray;NSArray*defaultHeadersArray;BOOLuserInputWasUpdatedBOOL;如果变量不是以上基本常用类型,则变量的命名就应该反映出自身的类型。但有时仅需要某些类的一个实例的情况下,那么只需要基于类名进行命名。NSImage*previewPaneImage;NSProgressIndicator*uploadIndicator;NSFontManager*fontManager;/基于类名命名大部分情况下,NSArray或NSSet类型的变量只需要使用单词复数形式(比如mailboxes),不必在命

16、名中包含“mutable”。如果复数变量不是NSArray或NSSet类型,则需要指定其类型。良好的风格:NSDictionary*keyedAccountNames;NSDictionary*messageDictionary;NSIndexSet*selectedMailboxesIndexSet;由于Objective-C不支持名字空间,为了防止出现命名空间的冲突,在类名和常类型变量名前添加一个由三个大写的字母组成的前缀(如 RNC),对于Core Data实体名则可以忽略此规则。如果你子类化了标准的Cocoa类,将前缀和父类名合并是一个很好的做法。如继承UITableView的类可命名

17、为 RNCTableView。常类型变量名的书写风格采用驼峰式大小写(第一个单词的首字母小写,其余单词的第一个字母大写。如firstName而不是first_name或firstname。),并使用关联的类名作为其命名前缀,推荐的做法:staticconstNSTimeIntervalRNCArticleViewControllerNavigationFadeAnimationDuration=0.3;不推荐的做法:staticconstNSTimeIntervalfadetime=1.7;下页内容更精彩下划线使用属性的时候,实例变量应该使用self.进行访问和设值。局部变量的命令不要包含下划

18、线。实例变量的命名必须使用下划线_作为前缀,这样可以缩小Xcode自动完成的选项取值范围。注释在需要的时候,注释可对代码做必要的解释。更新代码时一定要更新注释,防止对代码造成误解。使用javadoc风格的文档注释语法。注释的第一行是对注释API的总结,随后的注释行是对代码更多细节的解释。良好的风格:/*Themaximumsizeofadownloadthatisallowed.*Ifaresponsereportsacontentlengthgreaterthanthemax*willbecancelled.Thisishelpfulforpreventingexcessivememoryu

19、sage.*Settingthistozerowillallowalldownloadsregardlessofsize.*default150000bytes*/property(nonatomic)NSUIntegermaxContentLength;init与deallocdealloc方法应该被放置在实现方法的顶部,直接在synthesize或dynamic语句之后。init方法应该被放置在dealloc方法的下面。init方法的结构看上去应该像这样:-(instancetype)initself=superinit;/orcallthedesignatedinitalizerif(s

20、elf)/Custominitializationreturnself;字面值对于NSString,NSDictionary,NSArray和NSNumber类,当需要创建这些类的不可变实例时,应该使用这些类的字 面值表示形式。使用字面值表示的时候nil不需要传入NSArray和NSDictionary中作为字面值。这种语法兼容老的iOS版本,因此可以在 iOS5或者更老的版本中使用它。良好的风格:NSArray*names=Brian,Matt,Chris,Alex,Steve,Paul;NSDictionary*productManagers=iPhone:Kate,iPad:Kamal,

21、MobileWeb:Bill;NSNumber*shouldUseLiterals=YES;NSNumber*buildingZIPCode=10018;不良的风格:NSArray*names=NSArrayarrayWithObjects:Brian,Matt,Chris,Alex,Steve,Paul,nil;NSDictionary*productManagers=NSDictionarydictionaryWithObjectsAndKeys:Kate,iPhone,Kamal,iPad,Bill,MobileWeb,nil;NSNumber*shouldUseLiterals=NSN

22、umbernumberWithBool:YES;NSNumber*buildingZIPCode=NSNumbernumberWithInteger:10018;如非必要,避免使用特定类型的数字(相较于使用5.3f,应使用5.3)。CGRect函数相较于使用结构体辅助函数(如CGRectMake()函数),优先使用C99结构体初始化语法。CGRectrect=.origin.x=3.0,.origin.y=12.0,.size.width=15.0,.size.height=80.0;当访问CGRect结构体的x、y、width、height成员时,应使用CGGeometry函数,不直接访问结

23、构体成员。苹果对CGGeometry函数的介绍:All functions described in this reference that take CGRect data structures as inputs implicitly standardize those rectangles before calculating their results. For this reason, your applications should avoid directly reading and writing the data stored in the CGRect data struc

24、ture. Instead, use the functions described here to manipulate rectangles and to retrieve their characteristics.良好的风格:CGRectframe=;CGFloatx=CGRectGetMinX(frame);CGFloaty=CGRectGetMinY(frame);CGFloatwidth=CGRectGetWidth(frame);CGFloatheight=CGRectGetHeight(frame);不良的风格:CGRectframe=;CGFloatx=;CGFloaty=

25、;CGFloatwidth=;CGFloatheight=;常量优先使用常类型变量,而不是内嵌的字符串字面值或数字,因为常类型变量能很容易的复用常用的变量值(如),同时可以快速地修改值而无需查找替换。常类型变量应该声明为static类型,不要使用#define,除非常类型变量被作为宏使用。良好的风格:staticNSString*constRNCAboutViewControllerCompanyName=TheNewYorkTimesCompany;staticconstCGFloatRNCImageThumbnailHeight=50.0;不良的风格:#defineCompanyNameT

26、heNewYorkTimesCompany#definethumbnailHeight2枚举类型当使用enum关键字时,推荐使用苹果最新引入的固定基础类型语法,因为这将获得强类型检查与代码完成功能。SDK现在包含了一个固定基础类型的宏NS_ENUM()。NS_ENUM是在iOS6中开始引入的,为了支持之前的iOS版本,使用简单的内联方法:#ifndefNS_ENUM#defineNS_ENUM(_type,_name)enum_name:_type_name;enum_name:_type#endif良好的风格:typedefNS_ENUM(NSInteger,RNCAdRequestStat

27、e)RNCAdRequestStateInactive,RNCAdRequestStateLoading;私有属性私有属性应该被声明在实现文件的类扩展中(即匿名的category)。不要将私有属性声明在命名的category(如RNCPrivate或private),除非是扩展其他类。良好的风格:interfaceNYTAdvertisement()property(nonatomic,strong)GADBannerView*googleAdView;property(nonatomic,strong)ADBannerView*iAdView;property(nonatomic,strong)UIWebView*adXWebView;end图片的命名图片的命名应该保持一致,以图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论