objective-c property

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来省去读写函数的声明。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
//
// 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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 
// 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文件可以更改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
//
/ 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行代码可修改如下:

1
2
self.numofpages = num; 
self.title = booktitle

注意,许多人很容易忘记上面两行代码中的self,在这种情况下机器生成的读写函数并不会被调用,取而代之的是直接指针赋值,从而会引起内存泄露。

客户端代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
1
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值