二、oc中的setter与getter方法以及点语法
2015-03-07 22:44
435 查看
------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------
我们知道,在oc中,会有类的概念,我们可以将大致相同概念的东西归为一个类。大部分类中会包含有成员变量,初学时,我们会将成员变量设置为public类型,因为这样方便于我们进行赋值运算,可以通过''->''运算符进行调用。
@interface Person : NSObject { @public // 将成员变量设置为公有类型,在任何地方都可以给它赋值 int _age; double _height; } @end @implementation Person @end int main() { Person *p = [Person new]; p->_age = 90; // 通过->运算符,给_age赋值 p->_height = 200; // 通过->运算符,给_height赋值 NSLog(@"_age = %d,_height = %.2f",p->_age,p->_height); // 打印相应的值,用于检测,赋值是否成功 return 0; }但是,一般情况下,并不提倡使用public类型的成员变量,因为这样,会使这个类中的成员变量的安全性降低,公开化太高,任何人都可以修改成员变的值,保密性也较差。因此,一般选择设置为pravite类型或者是protected类型。pravite类型是成员变量,即为在该类中可以直接访问。protected类型的成员变量,即为该类与该类的子类中可以直接访问。
直接访问是指,直接给变量进行赋值。设置为了pravite与protected类型的成员变量,虽然部分情况下不能直接访问成员变量,但是可以通过setter与getter方法访问成员变
4000
量。
例如:
#import<Foundation/Foundation.h> @interface Person : NSObject { @private // 将成员变量设置为私有类型,只能在该类中直接访问 int _age; double _height; } - (void)setAge:(int)age; // _age的setter方法的声明 - (int)age; // _age的getter方法的声明 - (void)setHeight:(double)height; // _height的setter方法的声明 - (double)height; // _height的getter方法的声明 @end @implementation Person - (void)setAge:(int)age // _age的setter方法的实现 { _age = age; } - (int)age // _age的getter方法的实现 { return _age; } - (void)setHeight:(double)height // _height的setter方法的实现 { _height = height; } - (double)height // _height的getter方法的实现 { return _height; } @end int main() { Person *p = [Person new]; [p setAge:10]; // 调用_age的setter方法,等同于_age = 10 NSLog(@"_age = %d",[p age]); // 输出_age的getter方法 [p setHeight:175]; // 调用_height的setter方法,等同于_height = 175 NSLog(@"_heighr = %.2f",[p height]); // 输出_height的getter方法 return 0; }
setter方法
1.作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
2.命名规范:
1>方法名必须以set开头
2> set后面跟上成员变量的名称
3> 返回值一定是void
4> 一定要接收一个参数,而且参数类型跟成员变量类型一致
5> 形参的名称不能跟成员变量一样
getter方法
1.作用:返回对象内部的成员变量
2.命名规范:
1> 肯定有返回值,返回值类型肯定与成员变量类型一致
2> 方法名跟成员变量名一样
3> 不需要接收任何参数
setter方法,一般是用于设置不能直接访问的成员的变量的值,例如:需要在main函数中给Person类中的成员变量_age与_weight赋值,这时可以用到setter方法。
getter方法,一般是用于在setter方法已经设置好了成员变量的值后,用于查看当前成员变量的值,常与setter方法配合使用。
上面是setter方法与getter的基本写法,但是当成员变量过多的时,这样重复写同一类型的代码,会显示很无意义。因此我们可以用更加简洁的方法,来写setter于getter方法。
例如:
#import<Foundation/Foundation.h> @interface Person : NSObject { @private // 将成员变量设置为私有类型,只能在该类中直接访问 int _age; double _height; } @property int age; // _age的sette与getter方法的声明 @property double height; // _height的setter与getter方法的声明 @end @implementation Person @synthesize age = _age; // 其实这里也可以不用写 @synthesize height = _height; // 同上 @end int main() { Person *p = [Person new]; [p setAge:10]; // 调用_age的setter方法,等同于_age = 10 NSLog(@"_age = %d",[p age]); // 输出_age的getter方法 [p setHeight:175]; // 调用_height的setter方法,等同于_height = 175 NSLog(@"_heighr = %.2f",[p height]); // 输出_height的getter方法 return 0; }
用@property与@syntheszie的方法,可以快捷方便的达到相应的成员变量的setter与getter方法,通过同样的检测方法,可知,设置成功。其实在新版本的xcode中,可以更加简洁,可以只写出@property方法,不需要写@synthesize方法,也可以达到设置好setter于getter方法的目的。
@property与@synthesize,其实苹果官方已经封装好的方法,初学者,可以不用深究起具体实现的步骤,记住其书写的格式即可,这样可以便于快捷的写出setter于getter方法,这也是面向对象编程的一大好处。
点语法,同样也是为setter月getter方法服务的,一般情况下我们使用 [方法执行者 方法 : 传参]的形式来调用setter与getter方法。但是点语法可以更加直观与快捷。
例如:(上面代码中main函数中可以改为:)
int main() { Person *p = [Person new]; p.age = 10; // 调用_age的setter方法,等同于_age = 10 NSLog(@"_age = %d",p.age); // 输出_age的getter方法 p.height = 175; // 调用_height的setter方法,等同于_height = 175 NSLog(@"_heighr = %.2f",p.height); // 输出_height的getter方法 return 0; }
当写成p.age时,系统会自动调用相应的setter方法与getter方法。有人会问,这个是怎么识别是setter方法与getter方法的呢。其实比较简单,当p.age被赋值的时候,例如p.age = 90时,系统会自动调用_age的setter方法,给_age赋值,若写成p._age,则系统默认是给__age赋值。
当p.age传递一个值给另外一个变量,或者是返回一个值时,例如 int b = p.age,那么系统会自动调用_age的getter方法,返回出一个值。
综上所述,setter方法与getter方法都是oc中最最基本的语法,是初学者必须掌握好,并且熟练的语法,他可以便于我们操作成员变量。点语法也是为了setter方法与getter方法服务的,为程序员提供易读且直观的代码。
相关文章推荐
- OC-属性setter和getter以及点语法(2)
- OC实例变量可见度 setter方法和getter方法
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
- OC学习 第二章便利初始化 便利构造器 getter/setter方法
- 浅谈 JS 对象添加 getter与 setter 的5种方法以及如何让对象属性不可配置或枚举
- OC - @property与setter,getter方法
- OC中实例变量初始化方法,setter方法以及便利构造器的不同
- 黑马程序员-OC-getter & Setter方法
- 进击的KFC:OC(二)实例变量可见度、方法、setter、getter
- OC 中"烦人"的小特性之getter和setter以及property编译指令
- iOS-OC为什么需要重写setter或getter方法?
- 【OC学习-8】存取器方法?getter和setter?其实就是赋值和返回值的两种函数
- 黑马程序员——OC基础学习(三)---从传统setter方法和getter方法到@property增强型使用(体验代码的优化过程)
- oc中成员变量的set/get方法 以及 属性点语法的使用
- oc中的 getter 和setter方法 浅析示例
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
- OC基础语法学习3:setter/getter 点语法 @property @synthesize
- OC第二天-实例变量可见度,setter和getter方法,导入头文件 4000
- getter-setter方法/点语法
- OC中内存管理 assign, retain, copy 的 setter 和 getter 方法