Objective-C 2.0属性Property简明教程

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,在这种情况下机器生成的读写函数并不会被调用,取而代之的是直接指针赋值,从而会引起内存泄露。

客户端代码如下所示:

相关推荐