前言
在第一天里面, 我们知道了类, 对象, 方法, 还有一些基础知识, 到了第二天, 我们继续往下来慢慢学习, 只有耐心的学习, 才能学的好, 否则就像没有基座的塔一样, 倒了~
开始
在之前的例子里, 我们都知道怎么声明成员变量, 但如果要去访问成员变量的话, 就必须得写一个@public才能访问, 否则编译器会报错, 那么为什么会这样子呢? 下面让我们来慢慢解释:
在OC中, 在.m文件里声明的成员变量都是属于私有的, 也就是受保护的, 如果没有写@public, 那么就只有通过特殊的手段才能访问, 那么如何访问呢? 下面让我们来看看例子:
#import <Foundation/Foundation.h> @interface Preson : NSObject { int age; } - (void)test; @end @implementation Preson - (void)test { NSL(@"一个%d岁的人在走路.", age); } @end int main() { Preson *p = [Preson new]; p->age = 20; [p test]; return 0; }
这里我没有写@public, 所以输出的结果是:
1.封装思想.m:13:5: warning: implicit declaration of function 'NSL' is invalid in C99 [-Wimplicit-function-declaration] NSL(@"一个%d岁的人在走路.", age); ^ 1.封装思想.m:20:8: error: instance variable 'age' is protected p->age = 20; ^ 1 warning and 1 error generated.
编译器会报错, 说age这个成员变量被保护, 无法访问, 但我们之前也知道了, 不能在声明成员变量的时候给它赋值, 那么我们该怎么做呢?? 让我们继续往下看~~
在OC中, 有一种专门的方法来解决存取成员变量的方法, 它们就是Set方法和Get方法, 什么是Set方法? 什么是Get方法? 下面让我们一起来看看:
Set方法:
#import <Foundation/Foundation.h> @interface Preson : NSObject { int age; } - (void)test; - (void)setAge:(int)newAge; @end @implementation Preson - (void)test { NSLog(@"一个%d岁的人在走路.", age); } - (void)setAge:(int)newAge { age = newAge; } @end int main() { Preson *p = [Preson new]; [p setAge:20]; [p test]; return 0; }
这样子我们就可以把我们想要的值存入进去啦, 但还有一个问题, 我把值存进去了, 那如果我想取出来呢?? 这又要怎么取? 继续往下看:
Get方法:
#import <Foundation/Foundation.h> @interface Preson : NSObject { int age; } - (void)test; - (void)setAge:(int)newAge; - (int)age; @end @implementation Preson - (void)test { NSLog(@"一个%d岁的人在走路.", age); } - (void)setAge:(int)newAge { age = newAge; } - (int)age { return age; } @end int main() { Preson *p = [Preson new]; [p setAge:20]; [p test]; NSLog(@"一个%d岁的人在走路.", [p age]); return 0; }
通过上面这个Get方法, 我们就可以取到我们存进去的值了~~~其实这个Set方法和Get方法是一种间接式的存取方法, 非常好用~~下面是它们的解释以及注意的事项:
Set方法
1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
2.命名规范:
1> 方法名必须以set开头
2> set后面跟上成员变量的名称,成员变量的首字母必须大写
3> 返回值一定是void
4> 一定要接收一个参数,而且参数类型跟成员变量类型一致
5> 形参的名称不能跟成员变量名一样
Get方法
1.作用:返回对象内部的成员变量
2.命名规范:
1> 肯定有返回值,返回值类型肯定与成员变量类型一致
2> 方法名跟成员变量名一样
3> 不需要接收任何参数