使⽤用
@Property
创建存取器
使⽤用
@Property
创建存取器
// Car.h
#import <Foundation/Foundation.h>@interface Car : NSObject{
// 实例变量
NSString *carName;
NSString *carType;
}
@property(nonatomic,strong) NSString *carName;
@property(nonatomic,strong) NSString *carType;
@end
(让我们先忽略nonatomic和strong)。
// Car.m
#import "Car.h"
@implementation Car
@synthesize carName;
@synthesize carType;
@end
在.m⽂文件中我们使⽤用@synthesize⾃自动⽣生成这两个实例变量的存取器,并且隐藏了存取器,虽然我们看不到存取器,但它们确实是存在的。
// main.m
int main(int argc, char * argv[]){
@autoreleasepool {
Car *car = [[Car alloc] init];
car.carName = @"Jeep Compass";
car.carType = @"SUV";
NSLog(@"The car name is %@ and the type is %@",car.carName,car.carType);
}
return 0;
}
在上⾯面的代码中我们可以注意到,Car对象使⽤用点语法给存取器发送消息,并且get与set的语法是相同的,所以这⾥里的点语法可以根据语境判断我们是要赋值还是取值。
当然我们也依然可以使⽤用消息语法来使⽤用:
// main.m
int main(int argc, char * argv[]){
@autoreleasepool {
Car *car = [[Car alloc] init];
// 点语法
// car.carName = @"Jeep Compass";
// car.carType = @"SUV";
// NSLog(@"The car name is %@ and the type is %@",car.carName,car.carType);
// 消息语法
[car setCarName:@"Jeep Compass"];
[car setCarType:@"SUV"];
NSLog(@"The car name is %@ and the type is %@",[car carName],[car carType]);
}
return 0;
}
上⾯面两段代码的执⾏行结果都是:
The car name is Jeep Compass and the type is SUV
总结:@property等同于在.h⽂文件中声明实例变量的get/set⽅方法,@synthesize等同于在.m⽂文件中实现实例变量的get/set⽅方法。使⽤用@property和synthesize创建存取器要⽐比⼿手动声明两个存取⽅方法(getter和setter)更简单。⽽而且我们在使⽤用属性时可以使⽤用点语法赋值或取值,语法更简单,更符合⾯面向对象编程。
如果我们希望使⽤用默认的实例变量命名⽅方式,那么我们在.m⽂文件中就不需要使⽤用@synthesize声明,系统会帮我们⾃自动完成。如果我们希望⾃自⼰己命名实例变量命,那么我们就使⽤用@synthesize显⽰示声明我们希望的实例变量名。