@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:(int)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]