@property关键字和@synthesize关键字

来源:互联网 发布:linux 删除过期文件 编辑:程序博客网 时间:2024/06/05 10:02
@property关键字:
用来生成setter和getter方法的声明,也可以定义setter和getter方法

格式为:@property 类型  名称1,名称2...............

1.@property的基本使用
例:
Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{   int _age;}@property int age;// 这一句表示声明了 setAge和 age方法@end



--------------------------------------------------------------------------------------------------------------

Person.m

#import <Foundation/Foundation.h>@interface Person : NSObject{   int _age;}@property int age;// 这一句表示声明了 setAge和 age方法@end



--------------------------------------------------------------------------------------------
main.m

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){   Person *p = [Person new];   [p setAge:20];   NSLog(@"年龄 %d",[p age]);   return 0;}



如果在Person.h中没有@property,则在main.m中是不能调用到setAge和age方法的,因为没有方法的声明
但是,如果加上@property则表示了方法的声明。

@property会根据类型和名称来自动生成setter和getter方法的声明和定义

2.@property同时为多个成员变量声明setter和getter方法
格式为:@property 类型  名称1,名称2...............
注意:名称1,名称2的类型必须要一致,即成员变量的类型要一致
例:

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{   int _speed;   int _weight;}@property int speed,weight;//这里为 _speed, _weight声明setter 和getter方法,所以 _speed和 _weight的类型要一直@end



--------------------------------------------------------------------------------------------------
Person.m
#import "Person.h"@implementation Person@synthesize speed = _speed ,weight = _weight ;@end



在使用@property为多个成员变量声明setter和getter方法时,必须要成员变量类型一致。

-------------------------------------------------------------------------------------------------

3.@property即充当成员变量的setter和getter方法的声明,也充当setter和getter方法的定义
此时可以不用@synthesize关键字定义方法
例:

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{   int _speed;   int _weight;}@property int speed,weight;//这里为 _speed, _weight声明setter 和getter方法,所以 _speed和 _weight的类型要一直,同时会在类的定义中实现这两个成员变量的setter和getter方法@end



-------------------------------------------------------------------------------------------------

Person.m

#import "Person.h"@implementation Person//因为在类声明中使用了@property进行了setter和getter方法的声明,同时也实现了setter和getter方法,所以这里可以不需要再实现setter和getter方法@end


-------------------------------------------------------------------------------------------------
main.m

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){   Person *p = [Person new];   [p setSpeed:100]; //这里可以看出, @property自动为成员变量_speed生成了 setter方法   NSLog(@"速度: %d",[p speed]);   return 0;}




4.@property自动生成成员变量,且为其生成setter和getter方法的声明,并且为其实现setter和getter方法
不过自动生成的成员变量为私有的变量,且是在.m文件中声明的

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject@property int weight,speed;//@property自动生成 _weight和_speed 的成员变量,并为其声明 setter和 getter方法且实现这两个方法@end

---------------------------------------------------------------------------------------------

Person.m

#import "Person.h"@implementation Person@end

-----------------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){   Person *p = [Person new];   p.weight = 40;//采用点语法调用 setWeight   [p setSpeed:100];   NSLog(@"体重: %d,速度: %d",[p weight],p. speed);   return 0;}



上面的代码进行调试后可以发现在Person对象中有_weight和_speed两个成员变量



-------------------------------------------------------------------------------------------------

@synthesize关键字
1.这个关键字,必须要结合@property关键字使用
     格式为:@synthesize property ; 
     标准格式为:@synthesize property = 成员变量名 ,property = 成员变量名2..................
     后面的property就是在类声明文件中的@property的值,将作为getter和setter方法名称(setter方法:set+@property的值首字母大写),成员变量名表示在生成setter和getter方法时,给成员变量赋值和返回成员变量。

2.会自动生成setter和getter方法的实现,并访问age成员变量
@synthesize age = _age;
会自动生成下面的代码:
- (void) setAge:(int) age
{
 self->_age = age;
}
- (int) age
{
  return self->_age;
}

还可以@synthesize age = age,name = _name;

3.如果成员变量_name不存在,则会自动生成一个@private的成员变量_name


1.@synthesize的基本使用
例:

Person.h
#import <Foundation/Foundation.h>@interface Person : NSObject{   int _age;}@property int age;// 这一句表示声明了 setAge和 age方法@end



------------------------------------------------------------------------------------------

Person.m

#import "Person.h"@implementation Person@synthesize age = _age ;// 这一句使用了声明类中 @property的值,通过这句可以生成成员变量 _age对应的 setter和 getter方法@end

-------------------------------------------------------------------------------------------

main.m

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){   Person *p = [Person new];   [p setAge:20];   NSLog(@"年龄 %d",[p age]);   return 0;}



从上面看,如果没有@synthesize,则Person的定义中是没有setter和getter方法的定义的,所以在main方法中运行时,会报错,但是 因为@synthesize自动生成了setter和getter方法的定义,所以可以调用setAge和age方法。


-----------------------------------------------------------------------------------------------

2.@synthesize同时为多个成员变量定义setter和getter方法:
注意,这些成员变量的类型必须要一致

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{   int _speed;   int _weight;}@property int speed,weight;//这里为 _speed, _weight声明setter 和getter方法,所以 _speed和 _weight的类型要一直@end

-----------------------------------------------------------------------------------------------
#import "Person.h"@implementation Person@synthesize speed = _speed ,weight = _weight ;// 同时为多个成员变量定义 setter和 getter方法,需要成员变量的类型一致@end

-----------------------------------------------------------------------------------------------






0 0
原创粉丝点击