您的位置:首页 > 移动开发 > Objective-C

编写高质量Objective-C代码

2015-09-01 11:53 447 查看
点标记语法

属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法。

#良好的风格
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: