Objective-C 2.0属性Property简明教程是本文要介绍的内容,主要是来学习并了解Objective-C 2.0中的属性。Objective-C 2.0 为我们提供了property。它大大简化了我们创建数据成员读写函数的过程,更为关键的是它提供了一种更为简洁,易于理解的方式来访问数据成员。
我们先来看一下在Objective-C 1.x下我们声明Book类的头文件:
- //// Book.h #import <Cocoa/Cocoa.h>
- @interface Book : NSObject {
- NSString *title;
- NSNumber* numofpages;
- }
- - (id)initWithTitle:(NSString*) booktitle andNumofpages:(NSNumber*) num;
- - (NSString*) title;
- - (void) setTitle:(NSString*)newtitle;
- - (NSNumber*) numofpages;
- - (void) setNumofpages:(NSNumber*)newnumofpages;
- - (NSString*) summary;
- end
在Objective-C 2.0下,我们可以通过声明与数据成员同名的property来省去读写函数的声明。代码如下所示:
- //// Book.h #import <Cocoa/Cocoa.h>
- @interface Book : NSObject {
- NSString *title;
- NSNumber* numofpages;
- }
- - (id)initWithTitle:(NSString*) booktitle andNumofpages:(NSNumber*) num;
- @property (retain) NSString* title;@property (retain) NSNumber* numofpages;
- @property (readonly) NSString* summary;
- @end
我们为每一个数据成员声明了一个property。即使Book类中没有summary这个数据成员,我们同样可以声明一个名为summary的property。声明property的语法为:
@property (参数) 类型 名字;
这里的参数主要分为三类:读写属性(readwrite/readonly),setter语意(assign/retain/copy)以及atomicity(nonatomic)。
assign/retain/copy决定了以何种方式对数据成员赋予新值。我们在声明summary propery时使用了readonly,说明客户端只能对该property进行读取。atomicity的默认值是atomic,读取函数为原子操作。
下面我们来看一下在Objective-C 1.x 下implementation文件:
- //// Book.m #import "Book.h"
- @implementation Book //
- @synthesize title;
- - (id)initWithTitle:(NSString*) booktitle andNumofpages:(NSNumber*) num{
- self = [super init];
- if(nil != self) {
- [self setNumofpages:num];
- [self setTitle:booktitle];
- }
- return self;
- }
- - (NSString*) title{
- return title;
- }
- - (void) setTitle:(NSString*)newtitle{
- [title release];
- title = [newtitle retain];
- }
- - (NSString*) description{
- return title;
- }
- - (NSNumber*) numofpages{
- return numofpages;
- }
- - (void) setNumofpages:(NSNumber*)newnumofpages{
- [numofpages release];
- numofpages = [newnumofpages retain];
- }
- -(NSString*) summary{
- NSString* retstr = [[NSString alloc]initWithFormat:@"Title: %@, Number of pages: %@",
- title, numofpages];
- [retstr autorelease];
- return retstr;
- }
- - (void) dealloc{
- [numofpages release];
- [title release];
- [super dealloc];
- }
- @end
在Objective-C 2.0下,由于我们声明了property,implementation文件可以更改如下:
- //// Book.m #import "Book.h"
- @implementation Book
- @synthesize title;@synthesize numofpages;
- - (id)initWithTitle:(NSString*) booktitle andNumofpages:(NSNumber*) num{
- self = [super init];
- if(nil != self) {
- [self setNumofpages:num];
- [self setTitle:booktitle];
- }
- return self;
- }
- - (NSString*) description{ return title;
- }
- -(NSString*) summary{
- NSString* retstr = [[NSString alloc]initWithFormat:@"Title: %@, Number of pages: %@",
- title, numofpages];
- [retstr autorelease];
- return retstr;
- }
- - (void) dealloc{
- [numofpages release];
- [title release];
- [super dealloc];
- }
- @end
可以看到数据成员title和numofpages的读写函数已经不复存在,取而代之的是两行@synthesize,它让编译器在我们未提供读写函数时自动生成读写函数。
定义了property,客户端可以使用book.title来取代[book title],这种语法比从前更加直观简洁。
实现文件中的16-17行代码可修改如下:
- self.numofpages = num;
- self.title = booktitle
注意,许多人很容易忘记上面两行代码中的self,在这种情况下机器生成的读写函数并不会被调用,取而代之的是直接指针赋值,从而会引起内存泄露。
客户端代码如下所示:
- #import <Foundation/Foundation.h>
- #import "Book.h" int main (int argc, const char * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- NSString* name = [[NSString alloc] initWithString:@"Harry Porter"];
- NSNumber* number = [[NSNumber alloc] initWithInt:100];
- Book *book = [[Book alloc] initWithTitle:name andNumofpages:number];
- [number release];
- [name release];
- book.title = @"Twilight";
- book.numofpages = [NSNumber numberWithInt:200];
- NSString* str = book.summary;
- NSLog(@"summary: %@", str);
- [book release];
- [pool drain];
- return 0;
小结:Objective-C 2.0属性Property简明教程的内容介绍完了,希望通过本文的学习能对你有所帮助!