天天看点

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

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

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