属性property(二十二)

在属性之前,在定义实例变量时,每一个实例变量都需要配对一对getter、setter方法,这一对对的getter和setter方法,都需要我们一个个去声明和实现。由于写getter和setter方法是一项大量重复的工作,oc在2.0版本就给我们提供了解决这个问题的办法,就是加入@property。property的出现,就是为了简化代码和提高读写数据的安全性。

用@property来标识属性,标识后的变量,会自动生成与其变量名对应的getter和setter方法。我们在main方法中可以直接调用其getter和setter方法。

如定义了一个name变量,用@property来标识后,oc会自动生成一套getter,setter方法:getter方法:name,setter方法:setName:(包括冒号:)。则在main方法中,就可以直接调用name方法和setName:方法。

一般在类的.h文件中声明@property,系统自动生成getter,setter方法,此时如果我们不喜欢生成的getter、setter方法名,可以在.m实现文件中,在@implementation和@end之间,用@synthesize关键字,把我们想要的名字,赋值给我们的自动生成的getter、setter方法名。并且在以后调用,都要用我们起得方法名,不能再用getter、setter方法名。

一般情况下,我们不要去修改自动生成的getter、setter方法名。

@property 负责生成getter、setter方法名

@synthesize 负责实现getter、setter实现。

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject{

    NSString *name;

}

    //具体数学(推荐的书)

    //编程之美(推荐的书)

//自动生成一个带下划线 _ 的,并且以属性名命名的实例变量 属性名:name,自动生成 _name

//同时在.m文件中还生成了@synthesize 属性名 = 实例变量名

//@property生成了getter和setter方法的声明

//由@synthesize负责实现 getter、setter方法

@property NSString *name;

 

@end

Person.m

#import "Person.h"

@implementation Person

//一般不会修改自动生成的实例变量名

@synthesize name = _age;//若是这样改,则实例变量的名为:_age

//@synthesize name = _name;

 

- (void)test{

    _age = @"12233";

}

@end

main.m

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Person *p1 = [[Person alloc]init];

        [p1 setName:@"北京"];

        [p1 name];

        NSLog(@"%@",[p1 name]);//2015-04-22 10:29:19.463 OCLesson8_属性[878:36298] 北京

      

    }

    return 0;

}

原文地址:https://www.cnblogs.com/DevinSMR/p/5118629.html