编写高质量Objective-C代码
2015-09-01 11:53
447 查看
点标记语法
属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法。
异常和错误处理
不要在流控制语句中使用异常(NSException)。
异常仅用于表明程序员的错误。
为了表明一个错误,使用NSError *。
当一个方法通过引用返回一个错误参数,应该检测返回值的状态,而不是错误参数的状态。
字面值
对于NSString,NSDictionary,NSArray和NSNumber类,当需要创建这些类的不可变实例时,应该使用这些类的字 面值表示形式。使用字面值表示的时候nil不需要传入NSArray和NSDictionary中作为字面值。这种语法兼容老的iOS版本,因此可以在 iOS5或者更老的版本中使用它。
CGRect函数
相较于使用结构体辅助函数(如CGRectMake()函数),优先使用C99结构体初始化语法。
单例
应该使用线程安全的模式创建共享的单例实例。
属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法。
#良好的风格 view.backgroundColor = [UIColor orangeColor]; [UIApplication sharedApplication].delegate; #不好的风格 [view setBackgroundColor:[UIColor orangeColor]]; UIApplication.sharedApplication.delegate;
异常和错误处理
不要在流控制语句中使用异常(NSException)。
异常仅用于表明程序员的错误。
为了表明一个错误,使用NSError *。
当一个方法通过引用返回一个错误参数,应该检测返回值的状态,而不是错误参数的状态。
#良好的风格 NSError *error; if (![self trySomethingWithError:&error]) { // Handle Error } #不好的风格 NSError *error; [self trySomethingWithError:&error]; if (error) { // Handle Error }在方法执行成功的情况下赋值非Null值给错误参数,会使路径跳转到假条件分支(随后程序奔溃)。
字面值
对于NSString,NSDictionary,NSArray和NSNumber类,当需要创建这些类的不可变实例时,应该使用这些类的字 面值表示形式。使用字面值表示的时候nil不需要传入NSArray和NSDictionary中作为字面值。这种语法兼容老的iOS版本,因此可以在 iOS5或者更老的版本中使用它。
#良好的风格 NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"]; NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"}; NSNumber *shouldUseLiterals = @YES; NSNumber *buildingZIPCode = @10018; #不好的风格 NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil]; NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil]; NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES]; NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];
CGRect函数
相较于使用结构体辅助函数(如CGRectMake()函数),优先使用C99结构体初始化语法。
CGRect rect = {.origin.x = 3.0, .origin.y = 12.0, .size.width = 15.0, .size.height = 80.0 };当访问CGRect结构体的x、y、width、height成员时,应使用CGGeometry函数,不直接访问结构体成员。
#良好的风格 CGRect frame = self.view.frame; CGFloat x = CGRectGetMinX(frame); CGFloat y = CGRectGetMinY(frame); CGFloat width = CGRectGetWidth(frame); CGFloat height = CGRectGetHeight(frame); #不好的风格 CGRect frame = self.view.frame; CGFloat x = frame.origin.x; CGFloat y = frame.origin.y; CGFloat width = frame.size.width; CGFloat height = frame.size.height;
单例
应该使用线程安全的模式创建共享的单例实例。
+ (instancetype)sharedInstance { static id sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }
相关文章推荐
- Objective-C基础知识
- Associated Objects
- Objective-C入门 Xcode创建 HalloWorld
- Objective-C常用方法总结
- JSONObject遍历获取键值
- NSObject的load和initialize方法
- Annex B Rules for BER-TLV Data Objects
- equal方法在String类与Object类中的区别
- Selenium WebDriver 之 PageObjects 模式 by Example
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- Objective-C 【@property 的参数问题】
- Objective-C 【@property 的参数问题】
- OC随机数方法
- [objective-c]_[performSelector的使用]
- objective-C编程 面向对象的编程基本概念
- [Objective-c]_[NSString的基本使用]
- OC中如何进行多文件开发?
- IOS之Objective-C学习笔记(六)
- 斯坦福大学iOS应用开发教程学习笔记(第三课) Objective-C