Modern Objective-C

随着iOS 6 SDK的发布,又有一些新的改进,我们称之为Modern Objective-C。对于Modern Objective-C的详细讲解超出了本书的范围,我们在这里只是介绍一些关键的特性。

默认属性自动绑定(Default Property Synthesis)

有经验的iOS 开发人员都了解在接口文件中定义属性(property),然后在实现文件中定义synthesize代码。如下是iOS 应用程序中一段典型的接口文件代码。

#import <UIKit/UIKit.h>
@interface PhotoCollectionViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@end

在Modern Objective-C 引入之前,上述接口文件中定义的属性还需要相应的实现文件中定义@synthesize 指令,这样才能在实现文件中可以访问。
#import "PhotoCollectionViewCell.h"
@implementation PhotoCollectionViewCell
@synthesize imageView;
……
@end

然而在Modern Objective-C 引入之后,就可以不必编写@synthesize 指令了,@synthesize指令默认自动生成。
#import "PhotoCollectionViewCell.h"
@implementation PhotoCollectionViewCell
……
@end

当使用默认属性自动绑定时,可以使用属性名,前面添加一个下划线的前缀,就可以访问实例变量。例如访问前面定义的imageView实例变量,使用_imageView 或 self.imageView 就可以访问了。

方法顺序(Method Ordering)

方法顺序是指方法在Objective-C 代码文件中定义的位置。之前,要求方法定义的位置在它被调用之前,简单而言,就是先定义方法,然后才可以调用。如果将方法的定义放置在调用位置的后面,将导致编译错误。
@implementation DatabaseHandler
- (void)closeDatabaseFile {
[self flushBuffer];
}

- (void)flushBuffer {
// Code here to flush buffer
}

对于Modern Objective-C而言,方法的顺序不再是问题了,上述代码在编译时不会产生错误。

NSNumber 简化用法

NSNumber对象的初始化需要调用类的相关方法,意味这需要编写一些代码。如下是通过整型数据初始化NSNumber对象:
NSNumber *number = [NSNumber numberWithInt:100];
通过Modern Objective-C,可以简化代码获得相同的结果:
NSNumber *number = @100;
相似地,通过浮点数初始化NSNumber对象,之前的代码如下:
NSNumber *number = [NSNumber numberWithFloat:3.1415f];
也可通过如下的代码简化:
NSNumber *number = @3.1415f;
实际上,所有NSNumber类的numberWithXXX 方法,都可以使用Modern Objective-C 代码简化:
NSNumber *number;

number = @’A’; // Character
number = @YES; // Boolean
number = @111222333ul; // Unsigned Long
number = @123456l; // Long Long
number = @123.45 // Float
number = @123 // Integer
number = @123.432 // Double

现在直接使用@开头,加上数字,就完成了NSNumber对象的初始化,简单多了。

NSArray 数组简化

Modern Objective-C 也简化了NSArray对象的初始化方法。下面是之前的方式初始化NSArray对象的代码:
NSArray *carMakes;
carMakes = [[NSArray alloc]
initWithObjects:@"Chevy",
@"BMW",
@"Toyota",
@"Volvo",
@"Smart", nil];

使用Modern Objective-C的Array literals,上述代码可以简化为:
NSArray *carMakes;
carMakes = @[@"Chevy", @"BMW", @"Toyota", @"Volvo", @"Smart"];

现在,访问数组元素也相同地做了简化。例如,下面的代码用来访问数组元素0:
NSString *firstCar = [carMakes objectAtIndex:0];
使用Modern Objective-C,代码可以简化为:
NSString *firstCar = carMakes[0];

上述新的语法和我们所属性的C#、Java或C++语言很相似。相同地,给数组元素赋值的语法也进行了简化,可以通过如下代码对数组中第二个元素进行赋值操作:
carMakes[1] = @”VW Jetta”;

不过,上述初始化数组的代码默认创建不可变数组。如果需要可变数组,则还需要进一步调用mutableCopy方法,创建可变数组。
NSMutableArray *carMakes = [@[@"Chevy", @"BMW", @"Toyota", @"Volvo", @"Smart"] mutableCopy];

NSDictionary字典简化

和数组一样,Modern Objective-C 也简化了NSDictionary对象,NSDictionary 对象可通过如下的语法简化多组key-value键值对来初始化。之前初始化NSDictionary对象的代码如下所示:
NSDictionary *bookListing = [NSDictionary dictionaryWithObjectsAndKeys: object1, key1, object2, key2, object3, key3, nil];

通过Objective-C可以简化代码如下:
NSDictionary *bookListing = {key1 : object1, key2 : object2, key3 : object3};
和数组一样,下标可用来访问字典项,如下使用key1下标来访问bookListing字典对象:
bookObject = bookListing[key1];
相同地,如下代码可更新bookListing字典对象中key2键所对应的对象值:
bookListing[key2] = newBookObject;
和NSArray数组一样,使用上述语法定义的字典对象默认是不可变的。

iOS 6 SDK内置的Objective-C 编译器包含了大量的改进,可简化代码的阅读和减少开发人员输入代码量,为开发人员节省了不少时间。


Heqin:用了这么久, 才知道这个原来叫Modern Objective-c.啊, 学习了。

你可能感兴趣的:(Modern Objective-C)