@property和@synthesize

本文详细解析了Objective-C中的@property和@synthesize指令的作用与用法。介绍了这两种编译器指令如何帮助开发者简化setter和getter方法的创建过程,并讨论了Xcode 4.x版本更新后这些指令的新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值