您的位置:首页 > 运维架构

@property和@synthesize

2016-04-17 13:09 302 查看
@property和@synthesize


两个都是编译器指令,编译器指令是用来告诉编译器要做什么.

@property的历史存在两个阶段:

第一个阶段是Xcode4.X之前和之后.

在之前,@property只能生成setter/getter方法的声明:

格式:

@property int age;


会生成setter/getter方法的声明:

-(void)setAge:(int)age;
-(int)age;


@synthesize会生成setter/getter方法的实现:

格式:

@synthesize age = _age;


setter方法声明:

-(void)setAge:(in
4000
t)age
{
_age = age;
}
```

//getter方法实现:

-(int)age
{
return _age;
}


@property会告诉编译器做什么呢?

1.@property用在声明中告诉编译器声明成员变量的访问器(setter/getter)方法;

2.这样做的好处是我们可以免去手工书写setter方法和getter方法繁琐的代码;

@synthesize的注意点:

@synthesize age = _age;


在setter方法和getter方法的实现中会访问成员变量_age,如果成员变量_age不存在,就会自动生成一个@private的成员变量_age;

@synthesize age;

在setter方法和getter方法实现中会访问@synthesize后面的同名成员变量age,如果age不存在,就会自动生成一个@private的成员变量age;

多个属性可以通过一行@synthesize搞定,中间使用逗号链接:

@synthesize age = _age, number = _number, name =_name;


<————————分————————割—————————线———————>


自从Xcode4.X之后,@property可以同时生成setter和getter的声明和实现;

@property int age;


默认情况下,setter和getter方法中的实现,会访问下划线开头的成员变量(例如:_age), 如果没有就会自动生成一个开头的成员变量,自动生成的成员变量是私有变量,声明在.m中,在其他文件中无法查看,但是可以在本类中查看;@property只会生成简单setter/getter方法,不会进行数据判断;如果需要进行数据判断,我们需要重写getter/setter方法;

1.如果手动重写setter方法,编译器就只会自动生成getter方法;

2.如果手动生成getter方法,编译器就只会自动生成setter方法;

3.如果同时重写setter方法和getter方法,编译器就不会自动生成不存在的成员变量.

注释:在此,如果有@property int age;就不用再写_age这样的成员变量,编译器会自动生成一在.m中的私有成员变量_age.

@property还有一些修饰符:

@property int age;//默认的是可读可写;

@property (readonly) int age;//只生成setter方法不生成getter方法;(只读)

@property (readwrite) int age;//即生成setter方法又生成getter方法;


@property (getter = isGood) BOOL good;//通常BOOL类型的属性的getter方法要以is开头;


如果没有(getter = isGood),调用效果是:

[person good];


现在的调用效果是[person isGood];

[person isGood]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xcode iOS-OC