属性Properties
前面我们写caption和author的accessors的时候,你可以已经注意到了代码非常简明,应该可以被抽象提取出来。
属性在Objective-C里是一个新的功能。他可以让我们自动的生成accessors,另外还有一些别的优点。我们可以把上面Photo的类转成用属性来实现:
上面那个类原先的实现是这样:
- #import
- @interface Photo : NSObject {
- NSString* caption;
- NSString* photographer;
- }
- - (NSString*) caption;
- - (NSString*) photographer;
- - (void) setCaption: (NSString*)input;
- - (void) setPhotographer: (NSString*)input;
- @end
假如用属性来实现就是这样:
- #import
- @interface Photo : NSObject {
- NSString* caption;
- NSString* photographer;
- }
- @property (retain) NSString* caption;
- @property (retain) NSString* photographer;
- @end
@property是Objective-C来声明属性的编译指令。括号里面的"retain"指明了setter需要retain输入的对象。这行其他的部分指定了属性的类型以及名字。
下面让我们来看看这个类的实现:
- #import "Photo.h"
- @implementation Photo
- @synthesize caption;
- @synthesize photographer;
- - (void) dealloc
- {
- [caption release];
- [photographer release];
- [super dealloc];
- }
- @end
@synthesize指令自动的生成了我们的setters和getters。所以我们只需要实现类的dealloc方法。
Accessors只有当他们原先没有的时候,才会被生成。所以可以放心大胆的去用@synthesize来指定属性。而且可以随意实现你自己的getter和setter。编译器会自己去找哪个方法没有。
属性声明还有别的选项,但是限于篇幅层次,我们下次再介绍。
Logging
在Objective-C里,往console写日记非常简单。事实上NSLog()跟C语言的printf()两个函数几乎完全相同,除了NSLog是用额外的“%@”去获得对象。
- NSLog ( @"The current date and time is: %@", [NSDate date] );
我们可以log一个对象到console里去。NSLog函数调用要输出对象的description方法,然后打印返回的NSString。我们可以在自己的类里重写description方法,这样我们就可以得到一个自定义的字符串。