一、@property是编译器指令,告诉编译器给指定的成员变量生成get和set方法的【声明】
1)有类的成员变量_age 和_name,生成get和set方法的【声明】和【实现】
例如:
@interface Person : NSObject{
int _age;
NSString*_name;
}
@property int age; //生成_age的set和get方法
@property NSString *name;
-(void)test;
@end
@implementation Person
//打印成员变量信息
-(void)test{
NSLog(@"_name = %@,_age = %d",_name,_age);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.age = 23;
p.name = @"Amos";
NSLog(@"name = %@, age= %d",p.name,p.age);
[p test];
[p setAge:25];
[p setName:@"Allen"];
[p test];
}
return 0;
}
打印结果:
2015-10-05 09:16:09.204Day20[878:303] name = Amos, age = 23
2015-10-05 09:16:09.206Day20[878:303] _name = Amos, _age = 23
2015-10-05 09:16:09.206Day20[878:303] _name = Allen, _age = 25
分析结果:
由结果可知,在有_age和_name成员变量时使用@property可以同时生成他们的set、get方法的声明和实现
2)没有声明类的成员变量_age 和_name,此时@property会自动生成_age和_name,并且生成get和set方法的【声明】和【实现】
例如:
【注意】此时没有声明_age和_name
#import
@interface Person : NSObject
@property intage; //生成_age的set和get方法
@property NSString *name;
-(void)test;
@end
@implementation Person
//打印成员变量信息
-(void)test{
NSLog(@"_name = %@,_age = %d",_name,_age);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.age = 23;
p.name = @"Amos";
NSLog(@"name = %@, age= %d",p.name,p.age);
[p test];
[p setAge:25];
[p setName:@"Allen"];
[p test];
}
return 0;
}
打印结果:
2015-10-05 09:18:54.410 Day20[896:303] name = Amos,age = 23
2015-10-05 09:18:54.412 Day20[896:303] _name = Amos,_age = 23
2015-10-05 09:18:54.412 Day20[896:303] _name = Allen,_age = 25
【分析结果】
跟有声明_name和_age时是一样的,是不是很神奇很方便?
二、@synthesize在.m文件中生成set和get方法的定义实现
1)用法一:@synthesize 方法名;生成新的成员变量,且与原成员变量无关
例如:
#import
@interface Person : NSObject{
int _age;
NSString *_name;
}
@property intage; //生成_age的set和get方法
@property NSString *name;
-(void)test;
@end
@implementation Person
@synthesize age;//自动生成实例变量age,跟_age没关系
@synthesize name;//自动生成实例变量name,跟_name没关系
//打印成员变量信息
-(void)test{
NSLog(@"_name = %@,_age = %d",_name,_age);
NSLog(@"name = %@, age= %d",name,age);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.age = 23;
p.name = @"Amos";
NSLog(@"name = %@, age= %d",p.name,p.age);
[p test];
}
return 0;
}
打印结果;
2015-10-05 09:24:12.858 Day20[946:303] name = Amos,age = 23
2015-10-05 09:24:12.860 Day20[946:303] _name = (null),_age = 0
2015-10-05 09:24:12.860 Day20[946:303] name = Amos,age = 23
【分析结果】
@synthesize生成的age和name与_age和_name是没有关系的
1)用法二:@synthesize 方法名 = 成员变量名;与已有的成员变量建立关联
例如:
#import
@interface Person : NSObject{
int _age;
NSString *_name;
}
@property intage; //生成_age的set和get方法
@property NSString *name;
-(void)test;
@end
@implementation Person
@synthesize age = _age;//跟_age有关系
@synthesize name = _name;//跟_name有关系
//打印成员变量信息
-(void)test{
NSLog(@"_name = %@,_age = %d",_name,_age);
//NSLog(@"name = %@, age =%d",name,age);//此时再用age和name会报错
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.age = 23;
p.name = @"Amos";
NSLog(@"name = %@, age= %d",p.name,p.age);
[p test];
}
return 0;
}
打印结果:
2015-10-05 09:28:37.234 Day20[975:303] name = Amos,age = 23
2015-10-05 09:28:37.236 Day20[975:303] _name = Amos,_age = 23
【结果分析】
此时@synthesize生成的方法就与原有得成员变量建立了关联,@synthesize指定了成员变量之后就不会默认生成新的成员变量了。