Objective

前言

在第一天里面, 我们知道了类, 对象, 方法, 还有一些基础知识, 到了第二天, 我们继续往下来慢慢学习, 只有耐心的学习, 才能学的好, 否则就像没有基座的塔一样, 倒了~


开始

在之前的例子里, 我们都知道怎么声明成员变量, 但如果要去访问成员变量的话, 就必须得写一个@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> 不需要接收任何参数


原文地址:https://www.cnblogs.com/iOSCain/p/4282856.html