OC - @property与setter,getter方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gilgamesho/article/details/50551667

先说说setter与getter方法的作用

先上一段.m

/*=================================================
 设计一个K线类, 有三个属性, 最高价格, 最低价格, 平均价格. 
 要求可以设置和获取这三个属性
 =================================================*/
//  Created by 大L君 on 16/1/20.
//  Copyright © 2016年 bigL.com. All rights reserved.

#import <Foundation/Foundation.h>

@interface Kline : NSObject
{
    @protected//保护性
    int _valueTheHigh;
    int _valueTheLow;
    int _valueAver;
}
//setter方法声明
-(void)setValueTheHigh : (int)valueTheHigh;
-(void)setValueTheLow:(int)valueTheLow;
-(void)setValueTheAver:(int)valueTheAver;
//getter方法声明
-(int)valueTheHigh;
-(int)valueTheLow;
-(int)valueTheAver;

@end
@implementation Kline
//setter方法实现
-(void)setValueTheHigh : (int)valueTheHigh
{
    _valueTheHigh = valueTheHigh;
}

-(void)setValueTheLow:(int)valueTheLow
{
    _valueTheLow = valueTheLow;
}

-(void)setValueTheAver:(int)valueTheAver
{
    _valueAver = valueTheAver;
}
//getter方法实现
-(int)valueTheHigh
{
    return _valueTheHigh;
}

-(int)valueTheLow
{
    return _valueTheLow;
}

-(int)valueTheAver
{
    return _valueAver;
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Kline *kp = [Kline new];
        //只能通过setter方法对成员对象赋值
        [kp setValueTheHigh:20];
        //点语法在=号左边展开为setter方法
        kp.ValueTheLow = 10;
        //只能通过getter方法对成员对象读取
        int num = [kp valueTheHigh];
        //点语法在=号左边展开为[kp 方法名];
        int num2 = kp.valueTheLow;
        NSLog(@"valueTheHigh : %i",num);
        NSLog(@"valueTheLow : %i",num2);
    }
    return 0;
}

/*=================================================

一 . setter方法

作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

命名规范:

必须是对象方法
返回值类型为void
方法名必须以set开头,而且后面跟上成员变量名去掉”_” 首字母必须大写
必须提供一个参数,参数类型必须与所对应的成员变量的类型一致
形参名称和成员变量去掉下划线相同
setter方法的好处

setter方法优点:
不让数据暴露在外,保证了数据的安全性
对设置的数据进行过滤
===============================================/ /

二 .getter方法

作用:为调用者返回对象内部的成员变量的值

命名规范:

必须是对象方法
必须有返回值,返回值的类型和成员变量的类型一致
方法名必须是成员变量去掉下划线
一定是没有参数的

getter方法的优点:
可以让我们在使用getter方法获取数据之前,对数据进行加工;
比如双十一活动,我们希望对全线商品的价格在原来的价格基础上打五折,那么我们只要去改成品类的价格的getter方法就可以了,让他返回的值为价格 * 0.5
===============================================//

三 .getter/setter方法注意

  1. 在实际的应用中,不一定set和get方法都会提供,如果内部的成员变量,比如学生的学号或计算出来的数据。这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法 。
  2. 成员变量名的命名以下划线开头,get方法名不需要带下划线
    成员变量名使用下划线开头有两个好处 :
    a. 与get方法的方法名区分开来
    b. 可以和一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。当我看到以下划线开头变量,那么他一定是成员变量
    =================================================*/

@property与setter/getter方法

将上面的.m改写用@property

/*===================================================
 设计一个K线类, 有三个属性, 最高价格, 最低价格, 平均价格. 要求可以设置和获取这三个属性
===================================================*/
//  Created by 大L君 on 16/1/20.
//  Copyright © 2016年 bigL.com. All rights reserved.

#import <Foundation/Foundation.h>

@interface Kline : NSObject
//@property 生成setter/getter方法声明与方法实现
@property int valueTheHigh;
@property int valueTheLow;
@property int valueTheAver;
@end

@implementation Kline

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Kline *kp = [Kline new];
        //只能通过setter方法对成员对象赋值
        [kp setValueTheHigh:20];
        //点语法在=号左边展开为setter方法
        kp.valueTheLow= 10;
        //只能通过getter方法对成员对象读取
        int num = [kp valueTheHigh];
        //点语法在=号左边展开为[kp 方法名];
        int num2 = kp.valueTheLow;
        NSLog(@"valueTheAver : %i",num);
        NSLog(@"valueTheHigh : %i",num2);
    }
    return 0;
}

/*=================================================

一.@property的定义与使用

1.什么是@property
@property是编译器的指令

什么是编译器的指令 ?
编译器指令就是用来告诉编译器要做什么!

@property会让编译器做什么呢?
@property 用在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法
这样的好处是:免去我们手工书写getter和setter方法繁琐的代码

二.@property基本使用

在@inteface中,用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
- (int)age; // getter方法
- (void)setAge:(int)age; // setter方法

三.@property 使用格式

@interface 类名 : 父类名
{
(数据类型1)成员变量1;
}
@property (数据类型1)成员变量名1(去掉下), (数据类型2)成员变量2(去掉下);
//在Xcode 4.X版本之后@property自动生成setter与getter的声明与方法(以下默认使用该形式)
//默认情况下,setter和getter方法中的实现,会去访问下划线_开头的成员变量,
//如果没有会自动生成一个_开头的成员变量,自动生成的成员变量是私有变量, 声明在.m中,在其它文件中无法查看,但当可以在本类中查看
@end

四.注意点

1.@property只会生成最简单的getter/setter方法,而不会进行数据判断
2.如果需要对数据进行判断需要我们之间重写getter/setter方法
3.若手动实现了setter方法,编译器就只会自动生成getter方法
4.若手动实现了getter方法,编译器就只会自动生成setter方法
5.若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

五.@property修饰符

修饰是否生成getter方法的
readonly 只生成setter方法,不生成getter方法
readwrite 既生成getter 又生成setter方法(默认)
示例:
@property (readonly) int age;

指定所生成的方法的方法名称
getter=你定制的getter方法名称
setter=你定义的setter方法名称(注意setter方法必须要有 : )

@property (getter=isMarried) BOOL married;
说明,通常BOOL类型的属性的getter方法要以is开头
================================================*/

猜你喜欢

转载自blog.csdn.net/Gilgamesho/article/details/50551667