@property和@synthesize详解

[toc]
在使用oc进行开发时,经常需要对大量的成员变量生成设值方法和取值方法,如果全部手动实现,那么将浪费程序员大量的时间敲写这些重复性的垃圾代码。自从oc2.0开始,可以自动生成设值和取值方法。那就是使用@property属性和@synthesize关键字。关于这两个关键字使用中的细节在这里进行详细的解释。

1. 使用@property自动生成成员变量以及取值和设值方法

代码如下:

@interface Person:NSObject
@property int age; 
@end
@implementation Person
@end

解释:例如这种在实现部分不使用@synthesize,直接使用@property属性进行声明,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成如下的设值和取值方法。

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

2. 手动实现设值方法,使用@property自动生成成员变量和取值方法

代码如下:

@interface Person:NSObject
@property int age; 
- (void)setAge:(int)age;
@end
@implementation Person
- (void)setAge:(int)age
{
    _age = age;
}
@end

解释:例如这种在实现部分不使用@synthesize,直接使用@property属性进行声明,并且实现部分手动生成了设值setAge:方法,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成如下的取值方法。

- (int)age
{
    return _age;
}

同理,在实现部分不使用@synthesize,直接使用@property属性进行声明,并且实现部分手动生成了取值age:方法,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成setAge:的设值方法。

3. 手动实现设值和取值方法,使用@property不会自动生成成员变量

代码如下:

@interface Person:NSObject
{
    int _age; //此处必须手动实现
}
@property int age; 
- (void)setAge:(int)age;
- (int)age;
@end

@implementation Person
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}
@end

解释:例如这种手动实现设值和取值方法,那么即使使用了@property属性,那么编译器也不会自动生成一个int _age;型的成员变量,必须自己手动声明一个_age的成员变量。如果不手动声明,那么编译器就会报错,因为设值和取值方法找不到_age的成员变量。

4. @synthesize的使用

代码如下:

@interface Person:NSObject
{
    int _age; 
    int  age;
}
@property int age; 
@end

@implementation Person
@synthesize age;
@end

解释:
- 这种使用了@synthesize age;的情况,那么设置和取值方法会默认访问age成员变量,而不是_age成员变 量,如果没有声明age的成员变量,那么设置和取值方法才会访问_age的成员变量。
- 如果想让设置和取值方法访问_age的成员变量,那么必须显示指明,即使用@synthesize age=_age,这样设置和取值方法就会访问_age的成员变量,而不是age的成员变量。
- 例如@synthesize age=_age这种显示指明访问哪个成员变量的方式,如果没有声明_age的成员变量而声明了age的成员变量,那么编译器也不会访问age成员变量,编译器而是会自动生成一个_age的成员变量去访问。

总结

  1. @property和@synthesize提高了开发者的效率,不用重复的去敲写垃圾代码。
  2. 在使用了@property的情况,若手动实现了设值方法,编译会自动生成取值方法;若手动实现了取值方法,编译会自动生成设置值法(若只手动实现其中一个,编译器还会自动生成相应的成员变量);若手动实现了设值和取值方法,编译不会自动生成不存在的成员变量。
  3. @synthesize age=variablename,variablename决定了要访问的成员变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值