在属性之前,在定义实例变量时,每一个实例变量都需要配对一对getter、setter方法,这一对对的getter和setter方法,都需要我们一个个去声明和实现。由于写getter和setter方法是一项大量重复的工作,oc在2.0版本就给我们提供了解决这个问题的办法,就是加入@property。property的出现,就是为了简化代码和提高读写数据的安全性。
用@property来标识属性,标识后的变量,会自动生成与其变量名对应的getter和setter方法。我们在main方法中可以直接调用其getter和setter方法。
如定义了一个name变量,用@property来标识后,oc会自动生成一套getter,setter方法:getter方法:name,setter方法:setName:(包括冒号:)。则在main方法中,就可以直接调用name方法和setName:方法。
一般在类的.h文件中声明@property,系统自动生成getter,setter方法,此时如果我们不喜欢生成的getter、setter方法名,可以在.m实现文件中,在@implementation和@end之间,用@synthesize关键字,把我们想要的名字,赋值给我们的自动生成的getter、setter方法名。并且在以后调用,都要用我们起得方法名,不能再用getter、setter方法名。
一般情况下,我们不要去修改自动生成的getter、setter方法名。
@property 负责生成getter、setter方法名
@synthesize 负责实现getter、setter实现。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *name; } //具体数学(推荐的书) //编程之美(推荐的书) //自动生成一个带下划线 _ 的,并且以属性名命名的实例变量 属性名:name,自动生成 _name //同时在.m文件中还生成了@synthesize 属性名 = 实例变量名 //@property生成了getter和setter方法的声明 //由@synthesize负责实现 getter、setter方法 @property NSString *name;
@end |
Person.m
#import "Person.h" @implementation Person //一般不会修改自动生成的实例变量名 @synthesize name = _age;//若是这样改,则实例变量的名为:_age //@synthesize name = _name;
- (void)test{ _age = @"12233"; } @end |
main.m
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p1 = [[Person alloc]init]; [p1 setName:@"北京"]; [p1 name]; NSLog(@"%@",[p1 name]);//2015-04-22 10:29:19.463 OCLesson8_属性[878:36298] 北京
} return 0; } |