您的位置:首页 > 运维架构

OC - @property与setter,getter方法

2016-01-20 23:46 357 查看

先说说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方法注意

在实际的应用中,不一定set和get方法都会提供,如果内部的成员变量,比如学生的学号或计算出来的数据。这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法 。

成员变量名的命名以下划线开头,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开头

================================================*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC-propert setter getter