Objective-C的属性用于封装对象之中的数据,其作用同类的数据成员类似,但是所起到的作用远远大于普通的数据成员。声明属性使用@property关键字,这样就可以快速方便地为实例变量创建存取器,并可以通过点语法使用使用存取器。获取属性的变量值使用getter方法,设置属性的变量值使用setter方法。
使用属性的例子如下:
// // Vehicle.h // #import <Foundation/Foundation.h> @interface Vehicle : NSObject @property (nonatomic, copy) NSString *carName; @property (nonatomic, copy) NSString *carType; @end // // Vehicle.m // #import "Vehicle.h" @implementation Vehicle @end // // main.m // #import <Foundation/Foundation.h> #import "Vehicle.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... Vehicle *obj1 = [[Vehicle alloc] init]; obj1.carName = @"Ferrari"; obj1.carType = @"SuperSportCar"; NSLog(@"Car name is %@ and type is %@", obj1.carName, obj1.carType); Vehicle *obj2 = [[Vehicle alloc] init]; [obj2 setCarName:@"BMW X5"]; [obj2 setCarType:@"SUV"]; NSLog(@"Car name is %@ and type is %@", obj2.carName, obj2.carType); } return 0; }
@property等同于在头文件中声明了set和get方法,同时也自动在实现文件中使用synthesize实现了set和get方法。相对于自己手动声明数据和方法成员,使用属性可以大幅简化代码。
在声明属性的时候,还需要制定一些关键字对属性进行修饰,如nonatomatic、copy等。一般用来修饰属性的特性关键字有三类:原子性、存取器控制和内存管理。
主要用于控制属性的set和get方法。
另外,还可以自定义setter和getter的函数名,如:
@property (nonatoic, setter = mySetter:, getter = myGetter) NSString *name;
内存管理特性表明了该属性与保有它的对象之间的关系:
在iOS加入了ARC后,属性的内存管理特性新增添了strong和weak两个: