【语法】property synthesize

转载 2012年03月29日 11:53:53

Objective C 2.0 为我们提供了property。它大大简化了我们创建数据成员读写函数的过程,更为关键的是它提供了一种更为简洁,易于理解的方式来访问数据成员。

我们先来看一下在Objective C 1.x下我们声明Book类的头文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
//  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
12
13
14
15
16
17
18
19
//
//  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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//
//  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];
}
 
/* 
有的书上,是这种写法
- (void) setTitle:(NSString*)newtitle{
     if(title!=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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//
//  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
14
15
16
17
18
19
20
#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;
}

使用第三方框架的时候报“synthesize of ‘weak’ property is only allowed in ARC or GC mode”错

SBJson在ios下提示“@synthesize of ‘weak’ property is only allowed in ARC or GC mode” Posted 2014/08/23 ...
  • liu_ligui
  • liu_ligui
  • 2014年11月11日 17:31
  • 2353

object-c中@property @synthesize的用法

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/deta...
  • llf021421
  • llf021421
  • 2014年03月16日 02:02
  • 4391

OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'delegate'

在编写一个自定义相册的功能的时候,由于需要继承 UINavigationController写一个ImagePickerViewController,同时ImagePickerViewControll...
  • u010486174
  • u010486174
  • 2015年11月18日 10:33
  • 2961

Xcode: Auto property synthesis will not synthesize property 解决

Auto property synthesis will not synthesize property ‘title’; it will be implemented by its supercla...
  • zhenggaoxing
  • zhenggaoxing
  • 2015年08月28日 10:28
  • 1142

OC学习篇之---@property和@synthesize的使用

在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月14日 16:45
  • 29494

Auto property synthesis will not synthesize property 'description' because it is 'readwrite' but it

在AModel.h中 @property(nonatomic, strong) NSString *description; 出现提示warning: Auto property synth...
  • l863784757
  • l863784757
  • 2015年06月05日 11:51
  • 6052

2.属性详解(@property/@dynamic/@synthesize)

上一篇文章讲到, OC 2.0之后属性一旦声明,如果没有readonly修饰的话,当前类自动生成了setter和getter方法的声明, 并且会自动生成对应的实例变量(下划线 + 属性名)。而sett...
  • wangyanchang21
  • wangyanchang21
  • 2016年01月29日 16:26
  • 667

彻底解决:@synthesize of 'weak' property is only allowed in ARC or GC mode :问题

项目配置文件->Build Phrases->Complie Files,找到出现问题的资源库文件(比如weak修饰符所在的文件),双击Complie Files中的该文件,在空白行中写入-fobjc...
  • lbuskeep
  • lbuskeep
  • 2015年12月05日 04:52
  • 2241

Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its super

今天在XCode6.3上面重写TabBar的时候,自定义tabBar的代理遇到的一个问题 在重写tabBar的代理的时候遇到了一个警告。 解决方法: 在.m文件中 警告消失...
  • u011068996
  • u011068996
  • 2015年07月07日 13:08
  • 2724

解决 Cannot synthesize weak property in file using manual reference counting

今天在工程中导入MJRefresh后进行编译 报错 提示  Cannot synthesize weak property in file using manual reference countin...
  • Loving__Dream
  • Loving__Dream
  • 2016年04月06日 16:44
  • 12675
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【语法】property synthesize
举报原因:
原因补充:

(最多只允许输入30个字)