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

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

Student.h文件中声明

#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) 类型 名字;
如:

@property(nonatomic,retain) int age;

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

@property int age;

这一句代码就等价于

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

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

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

@end

是不是简单了很多,

@property int _age;

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

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

这两个方法是完全等价的

2、@synthesize语法,作用就是自动生成getter方法和setter方法的实现
有简洁声明也就会有相应的简洁实现,我们先来复习一下传统的实现方式

#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

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

#inport"Student.h"
@implementation Student @synthesize age;
  @synthesize no;

@end

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

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

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

1.@synthesize age 会自动去访问跟age同名的变量。
2.如果找不到则生成跟age同名的私有变量

@synthesize 还有一种写法是

@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.

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

等效代码:

-(test*)thetest {
return thetest;
}

2.

@property(retain)test* thetest;
@property(copy)test* thetest;

等效代码:

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

二、setter分析

1、

@property(nonatomic,retain)test* thetest;
@property(retain)test* thetest;

等效于:

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

2、

@property(nonatomic,copy)test* thetest;
@property(copy)test* thetest;

等效于:

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

相关链接

IOS开发基础Object-C—05OC变量的作用域、self
http://blog.csdn.net/u010037928/article/details/49585057
IOS开发基础Object-C— 04构造方法和description方法
http://blog.csdn.net/u010037928/article/details/49557069
IOS开发基础Object-C——03点语法
http://blog.csdn.net/u010037928/article/details/49534683
IOS开发基础Object_C——02 第一个OC类
http://blog.csdn.net/u010037928/article/details/49519709
IOS开发基础Object_C——01 OC概述及比较
http://blog.csdn.net/u010037928/article/details/49515627

MJ老师视频地址
OC@property和@synthesize http://pan.baidu.com/s/1nt3sRw9

你可能感兴趣的:(ios,property,synthesize,setter方法,getter方法)