黑马程序员----Objective-C学习笔记之@property关键字和@synthesize用法

时间:2021-04-17 00:18:59
------Java培训、Android培训、iOS培训、.Net培训--------

一、@property是编译器指令,告诉编译器给指定的成员变量生成get和set方法的【声明】

1)有类的成员变量_age_name,生成get和set方法的【声明】和【实现】

例如:

<span style="font-size:18px;">@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;
}</span>


打印结果:

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 <Foundation/Foundation.h>

@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文件中生成setget方法的定义实现

1)用法一:@synthesize方法名;生成新的成员变量,且与原成员变量无关

例如:

 

#import <Foundation/Foundation.h>

@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生成的agename_age_name是没有关系的

 

1)用法二:@synthesize方法名 =成员变量名;与已有的成员变量建立关联

例如:

 

#import <Foundation/Foundation.h>

@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指定了成员变量之后就不会默认生成新的成员变量了。