先说说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开头
================================================*/