Objective-C的那些事——设置器(setter)和访问器(getter)

来源:互联网 发布:职称英语网络课程 编辑:程序博客网 时间:2024/06/14 09:55

最近进入了Objective-C的学习阶段,由于刚开始接触的是类和对象,教我们学习的范哥怕我们不会创建类和对象,一次性给我们布置了创建40个类的作业,再加上其他事情,博客已经好几天没更新了。在这里说明一下,之前我一直更新的是有关C语言的题目,现在将开始更新有关Objective-C的一些知识点以及平时做的题目。当然了,C语言系列还会继续更新,由于需要在Objective-C花费较多的时间,所以C语言系列更新频率不会太高。

言归正传,今天和大家分享一些有关设置器(setter)和访问器(getter)的知识。

对于一个类,我们怎么才能在main.函数里面访问到他的实例变量以及对实例变量重新赋值呢?

大家知道,关于类的实例变量有三种可见度,分别是:

(1)@public(公共的),在任何文件中都可以访问。
(2)@protected(受保护的),
有一定的访问权,只允许在本类文件以及子类文件中访问,其他文件按不可以访问
(3)@private(私有的)
只允许在本类文件中访问,不可以在子类文件中以及其他文件中访问
如果我们在定义实例变量时没做可见度声明的话默认的是@protected。这种可见度在main函数里是无法对实例变量访问和修改的。

有些人会说,那我们把实例变量的可见度设置为@public的不就行了么。

这样做是可以的,就是在定义实例变量时自己把可见度设置为@public,这样我们就可以在main函数里想怎么访问和修改实例变量都可以。

但是,没人会这么做的。为什么呢?

(1)把实例变量声明为@public的话,外部就可以随意访问和修改,这样会影响内部的实现

(2)面向对象的三大特性之一是封装,封装的思想就是隐藏内部实现,只提供外部接口,设置成@public的话就违背了这一思想。

那我们还怎么做才可以访问和修改实例变量呢?

今天的主角设置器(setter)和访问器(getter)就要隆重登场了。

虽然我们在类的外部文件中不能直接访问和修改,那么我们就间接的通过设置器(setter)和访问器(getter)访问和修改。关于设置器(setter)和访问器(getter)的思想个人是这样理解的,类的内部成员可以对类的进行访问和修改,我们只需要把想要修改的和想要访问的传递过去,由类内部来实现,然后再反馈给我们。

下面通过代码来体会一下设置器(setter)和访问器(getter)的用法。

我们首先定义一个类和声明一些方法,具体代码如下:

#import <Foundation/Foundation.h>@interface Person : NSObject{    NSString *_name;     // 姓名    NSString *_gender;   // 性别    NSInteger _age;      // 年龄}    // 设置器 setter方法// 为 name 赋值- (void)setName:(NSString *)name;// 为 gender 赋值- (void)setGender:(NSString *)gender;// 为 age 赋值- (void)setAge:(NSInteger)age;    // 访问器 getter方法// 读取 _name 的值- (NSString *)name;// 读取 _gender 的值- (NSString *)gender;// 读取 _age 的值- (NSInteger)age;@end

接下来我们再看一下类的实现部分:

#import "Person.h"@implementation Person// 为 name 赋值- (void)setName:(NSString *)name{    _name = name;}// 为 gender 赋值- (void)setGender:(NSString *)gender{    _gender = gender;}// 为 age 赋值- (void)setAge:(NSInteger)age{    _age = age;}// 读取 _name 的值- (NSString *)name{    return _name;}// 读取 _gender 的值- (NSString *)gender{    return _gender;}// 读取 _age 的值- (NSInteger)age{    return _age;}
最后我们来看怎么在主函数里使用:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){    @autoreleasepool {        Person *person = [[Person alloc] init];        [person setName:@"Duke"];        [person setGender:@"Man"];        [person setAge:18];        NSLog(@"name:%@, gender:%@, age:%ld", [person name], [person gender], [person age]);    }    return 0;}

运行结果截图如下:


这样我们就达到了通过设置器(setter)和访问器(getter)修改和访问实例变量的目的了

有关设置器(setter)和访问器(getter)的简单介绍就到这里,如果文章中有错误的地方还请多多批评指正

0 0
原创粉丝点击