首先介绍一下设置实例变量(setter)方法和访问实例变量(getter)的方法 ,那么问题来了,set和get方法的做用是什么呢?这里不得不提到一个概念『封装』。安全
咱们以前使用类属性时,都会在花括号的里面加上一个 @public 。也就是说这类的属性是公开的,这时谁均可以对它进行修改,当一个类把它的属性暴露给外部的时候,那么该类就失去了对属性的控制权。对象
在OC语言中,使用@interface和@implementation来处理类。接口
就比如一款网游(具体过程复杂的多,只是举例加深理解),你看到的界面,进行的操做(如攻击,补充体力等等)都是你能够调用的方法,那么这些方法的名称的声明就是在@interface中开发
而你在执行操做时,程序把你的命令实现并展示在你眼前的这个过程,你是看不到的,而这就是@implementation里进行的get
@interface就好像暴露在外面的时钟表面,向外界提供展现以及接口。io
(类的属性在不声明的状况下默认都是@private:也就是私人的,在其余类中是没法调用的)变量
@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。原理
封装的原理就是: 让实例变量默认只能被类的对象方法所调用.程序
介绍了封装的做用和原理,咱们回到set get方法,介绍一下set和get 方法的使用方法
在前面提到为了安全性考虑,咱们通常不会在成员变量名前面使用 @public@@protected等关键字修饰 ,而是用set方法来为对象提供成员的值,set内部也能够对一些不合理是数据进行筛选。
set方法的做用是:为外界提供一个设置成员变量的方法。
那么咱们不由要想,既然封装是要让实例变量默认只能被对象方法调用,那么为何咱们还要一个可让外界设置成员变量的方法呢?能够思考一下。
这里要注意几点:
*方法名必须以set开头
*set跟的成员变量名称开头首字母必须大写
*返回值必定是void
*必定要接受一个参数,并且成员变量和参数名一致
*形参名不能和成员变量名同样,苹果官方推荐成员变量名加_来进行区分,因此咱们能够发现全局变量一般声明是都会加上一个下划线。
set的方法的好处是
*不让数据暴露在外,确保了数据的安全性
*对设置的数据进行过滤
set方法的实现
接下来介绍get方法
它的做用:为调用者返回对象内部的成员变量
get方法的声明中要注意的几点
*方法名与成员变量名一致
*返回值类型与成员变量类型一致
*不须要接受任何参数
而后实现它
在实际开发中,不必定set和get方法都会同时出现,若是咱们只容许用户读取成员变量,可是不容许修改时,咱们能够只提供get方法,而不提供set方法
并且成员变量名的命名如下划线开头,get方法名不须要带下划线,使用下划线开头有两个好处:
*与get方法的方法名区分开来
*能够和一些其余的局部变量区分开来,下划线开头的变量,一般都是类的成员变量。