setter方法 、getter方法、点语法、@property

来源:互联网 发布:javascript解析json 编辑:程序博客网 时间:2024/06/05 06:34

setter方法和getter方法

由于我们经常定义一些方法来操作成员变量,所以就有了getter和setter方法

setter方法

  • 作用:设置成员变量的值
  • 命名规则:
    -(void) set变量名(首字母大写):(成员变量类型)形参名;

getter方法

  • 作用:获取成员变量的值
  • 命名规则
    -(成员变量类型)成员变量名;
@interface Student : NSObject{    NSString *_name;}//setter方法声明-(void)setName:(NSString*)name;//getter方法声明-(NSString *)name;@end@implementation Student//setter方法实现-(void)setName:(NSString*)name{    _name = name;}//getter方法实现-(NSString *)name{    return _name;}@endint main(int argc, const char * argv[]) {    Student *stu = [[Student alloc]init];    //setter方法    [stu setName:@"ABCD"];    //getter方法    NSLog(@"name:%@",[stu name]);    return 0;}

点语法

int main(int argc, const char * argv[]) {    Student *stu = [[Student alloc]init];    stu.name = @"ABCD";    NSLog(@"name:%@",stu.name);    return 0;}
  • 如果系统提供了getter 和setter方法,那么访问属性就多了一种方式,称为点语法。
  • 点语法的本质是调用了getter和setter方法
  • 点语法是一个编译器的特性,会在程序编译成二进制的时候将点语法自动转化为setter和getter方法。
  • 如果点语法在等号左边,那么编译器会自动转换为setter方法
  • 如果点语法在等号右边或没有等号,那么编译器会自动转化为getter方法
  • 点语法一般用于给成员变量赋值,如果不是给成员变量赋值一般情况下不建议使用。

@property

@interface Student : NSObject@property NSString *name;@end@implementation Student@endint main(int argc, const char * argv[]) {    Student *stu = [[Student alloc]init];    stu.name = @"ABCD";    NSLog(@"name:%@",stu.name);    return 0;}
  • @property是一个编译器指令, 会在程序编译时转换为setter方法和getter方法的声明
//setter方法声明-(void)setName:(NSString*)name;//getter方法声明-(NSString *)name;
  • @synthesize是一个编译器指令, 会在程序编译时转换为setter方法和getter方法的实现
//setter方法实现-(void)setName:(NSString*)name{    _name = name;}//getter方法实现-(NSString *)name{    return _name;}
  • 注意

    • 在Xcode4.5及以后的版本中,可以省略@synthesize,直接写@property就可以,这样Xcode会自动生成完整的setter方法和getter方法的实现
    • 如果想对传入的参数进行过滤,那么就必须重写getter方法和setter方法,或者重写其中的一个,不管重写哪一个,@property都会生成剩下的那一个
    • 如果利用@property来生成getter方法和setter方法,可以不写成员变量,系统会自动生成一个_开头的成员变量。
    • 如果同时重写了getter方法和setter方法,那么@property就不会自动生成私有的成员变量
  • property修饰符

    • readonly: 只会生成getter方法
    • readwrite:既会生成getter也会生成setter方法,默认什么不写就是readwrite
    • getter:可以给生成的getter方法起一个名字
    • setter:可以给生成的setter方法起一个名字
      @interface Student : NSObject@property (readonly) NSString *name;@property (readwrite) int age;;@property (getter=isRight) BOOL right;@property (setter=tizhong:) double weight;@end
0 0