IOS开发基础Object-C—06@property 和@synthesize语法

来源:互联网 时间:1970-01-01

今天我们来学一下@property和@synthesize语法,在我的前几篇博客中,我详细介绍了getter方法和setter方法的创建,我们再来回顾一下。

Student.h文件中声明

[code]#import<Foundation/Foundtion.h>@interface Student :NSObject{ int age; int no;}-(int)age; //get方法-(void)setAge:(int)newAge; //set方法-(int)no;-(void)setNo:(int)newNo;@end


大家也感受到了,使用这种方法太繁琐了,占用了大量的代码数量,而且有很多冗余代码,下面我就来为大家介绍一种新的getter,setter方法。

1、@property语法,作用就是自动生成getter方法和setter方法的声明

声明property的语法为:

@property (参数1,参数2) 类型 名字;

如:

[code]@property(nonatomic,retain) int age;


在这里我们先暂时忽略@property的参数,在后面的附录中我会给大家详细介绍

[code]@property int age;


这一句代码就等价于

[code]-(int)age; //get方法-(void)setAge:(int)age; //set方法


也就是说我们完全可以这样写我们的getter方法和setter方法的声明

[code]#import<Foundation/Foundtion.h>@interface Student :NSObject{ int age; int no;}@property int age;//age的getter、setter方法@property int no; //no的getter、setter方法@end


是不是简单了很多,

[code]@property int _age;


当编译器遇到@property的时候自动展成以下方法:

[code]-(int)_age; //get方法-(void)set_age:(int) _age; //set方法


这两个方法是完全等价的

2、@synthesize语法,作用就是自动生成getter方法和setter方法的实现

有简洁声明也就会有相应的简洁实现,我们先来复习一下传统的实现方式

[code]#inport"Student.h"@implementation Student -(int)age{return age; } -(void)setAge:(int)newAge{age=newAge; } -(int)no{return no; } -(void)setNo:(int)newNo{no=newNo; }@end


同样,我们也可以用两行代码解决上面这一大堆垃圾代码

[code]#inport"Student.h"@implementation Student @synthesize age; @synthesize no;@end


就这样简单,当编译器遇到 @synthesize age,的时候就自动展开成

[code] -(int)age{return age; } -(void)setAge:(int)newAge{age=newAge; }


还有几点大家需要特别注意的地方:

1.@synthesize age 会自动去访问跟age同名的变量。

2.如果找不到则生成跟age同名的私有变量

@synthesize 还有一种写法是

[code]@implementation Person @synthesize name = _name; @synthesize sex = _sex; @synthesize age = _age;@end


表示实现3个 setter 和 getter 方法,其中 name = _name 表示说在 getter 和 setter 方法中操作的实例变量是 _name,如果省略了 _name ,_age, _sex, 那么会在. h 文件中生成同名的实例变量 name,sex,age(注意:这里并没有下划线),此时生成的 setter 和 getter 方法所操作的实例变量是 name,sex,age, 所以_name,_sex,_age 并没有被操作。

在 ios5.0后,@synthesize也可以省略不写,此时在. h 文件中只写@ property 即可,编译器会自动生成相应的实例变量,实例变量的名字是属性名称前加下划线.

附@property 参数说明:

声明property的语法为:

@property (参数1,参数2) 类型 名字;

其中参数主要分为三类:

读写属性: (readwrite/readonly/setter = /getter = )

setter语意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

各参数意义如下:

readwrite

产生setter/getter方法

readonly

只产生简单的getter,没有setter, 默认的读写属性.

setter =

指定生成setter方法的名字

getter =

指定生成getter方法的名字

assign

默认类型,setter方法直接赋值,而不进行retain操作, 适用于基本数据类型, 对对象类型, 不会发生引用计数变化.

retain

setter方法对参数进行release旧值,再retain新值。

copy

setter方法进行Copy操作,与retain一样

atomic

保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.

nonatomic

禁止多线程,变量保护,提高性能

参数中比较复杂的是retain和copy,具体分析如下:

一、getter分析

1.

[code]@property(nonatomic,retain)test* thetest;@property(nonatomic ,copy)test* thetest;


等效代码:

[code]-(test*)thetest{return thetest;}


2.

[code]@property(retain)test* thetest;@property(copy)test* thetest;


等效代码:

[code]-(test*)thetest{[thetest retain];return [thetest autorelease];}


二、setter分析

1、

[code]@property(nonatomic,retain)test* thetest;@property(retain)test* thetest;


等效于:

[code]-(void)setThetest:(test *)newThetest { if (thetest!= newThetest) {[thetest release];thetest= [newThetest retain]; }}


2、

[code]@property(nonatomic,copy)test* thetest;@property(copy)test* thetest;


等效于:

[code]-(void)setThetest:(test *)newThetest { if (thetest != newThetest) {[thetest release];thetest= [newThetest copy]; }}


相关链接

IOS开发基础Object-C—05OC变量的作用域、self

http://www.lai18.com/content/1160967.html

IOS开发基础Object-C— 04构造方法和description方法

http://www.lai18.com/content/1160966.html

IOS开发基础Object-C——03点语法

http://www.lai18.com/content/1160965.html

IOS开发基础Object_C——02 第一个OC类

http://www.lai18.com/content/1160964.html

IOS开发基础Object_C——01 OC概述及比较

http://www.lai18.com/content/1160963.html

MJ老师视频地址

OC@property和@synthesize http://pan.baidu.com/s/1nt3sRw9



相关阅读:
Top