首页 > 学院 > 开发设计 > 正文

OC基础--对成员变量的封装

2019-11-14 18:25:55
字体:
来源:转载
供稿:网友
#import <Foundation/Foundation.h>//日期结构体typedef struct{    int year;    int month;    int day;} Date;@interface School : NSObject{    //@public    NSString * _name;    NSString * _address;    Date _createTime;}- (void) introduction;@end
#import "School.h"@implementation School- (void)introduction{    NSLog(@"学校名称:%@, 学校地址:%@, 创办时间:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day);}@end
#import <Foundation/Foundation.h>#import "School.h"int main(int argc, const char * argv[]) {         School * s = [School new];     s->_name = @"科技大学";     s->_address = @"XX省XX市XX区XX路XX号";     s->_createTime.year = 2045;     s->_createTime.month = 13;     s->_createTime.day = 34;       [s introduction];        return 0;}

如果成员变量是public, 给成员变量赋值的时候, 赋予的值不受我们的约束, 在外部可以随便读写  外界有可能赋值一些脏数据

 封装:

  屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口

  好处:保证数据的安全性    将变化隔离

  规范: 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其访问

Getter - Setter方法:

  setter方法:

     作用: 设置成员变量的值

     格式:

       1. setter方法一定是对象方法

       2. 一定没有返回值

       3. 一定以set开头, 并且set后面跟上需要设置的成员变量的名称去掉下划线, 并且首字母大写

       4. 一定有参数, 参数类型一定和需要设置的成员变量的类型一致, 并且参数名称就是成员变量的名称去掉下划线

        //成员变量以下划线开头的好处,就是可以区分局部变量和成员变量        - (void) setName: (NSString *) name{           //可在这里添加验证代码对传入的数据做验证            _name = name;        } 

   getter方法:

     作用: 获取成员变量的值

     格式:

       1. getter方法一定是对象方法

       2.一定有返回值, 而且返回值一定和获取的成员变量的类型一致

       3.方法名称就是获取的成员变量的名称去掉下划线

       4. 一定没有参数

        - (NSString* ) name{            return _name;        } 

     > 一个属性可以只有getter方法, 没有setter方法, 这种属性我们称之为只读属性

     > 一个属性也可以只有setter方法, 没有getter方法, 这种属性我们称之为只写属性

     > 如果既有setter方法又有getter方法, 那么这种属性我们称之为可读可写的属性

     > 一个属性也可以没有getter和setter, 这种属性我们称之为私有属性

  Getter - Setter 方法的调用:   

   Date date = {1990, 1, 1};       School * s = [School new];     [s setName:@"test"];    [s setAddress:@"tset"];    [s setCreateTime:date];        NSLog(@"学校名:%@", [s name]); 

  点语法:

       > 如果给属性提供了getter和setter方法, 那么访问属性就又多了一种访问方式 , 点语法

       > 点语法其实它的本质就是调用setter和getter方法

       > 点语法是一个编译器的特性, 会在程序翻译成二进制的时候将.语法自动转换为setter和getter方法的调用

       > 如果点语法在=号的左边, 那么编译器会自动转换为setter方法

       > 如果点语法在=号的右边, 或者没有等号, 那么编译器就会自动转换为getter方法  

     s.name = @"test";       // 等效于  [s setName:@"test"];      s.address = @"测试";     // 等效于  [s setAddress:@"测试"];      s.createTime = date;    // 等效于  [s setCreateTime:date];         NSLog(@"学校名:%@, 学校地址:%@", s.name, s.address);      // 等效于  NSLog(@"学校名:%@, 学校地址:%@", [s name], [s address]); 

         > 点语法一般用于给成员变量赋值, 如果不是给成员变量赋值一般情况下不建议使用, 但是也可以使用

    - (void)test:(int)num{        NSLog(@"测试数据 %i", num);    }    s.test;   // 等效于  [s test]

 

#import <Foundation/Foundation.h>//日期结构体typedef struct{    int year;    int month;    int day;} Date;@interface School : NSObject{    //@public    NSString * _name;    NSString * _address;    Date _createTime;}-(void) setName: (NSString *) name;-(NSString* ) name;- (void) setAddress: (NSString *) address;- (NSString *) address;- (void) setCreateTime: (Date) date;- (Date) createTime;- (void) introduction;- (void) test;- (void) test: (int) num;@end#import "School.h"@implementation School-(void) setName: (NSString *) name{    //可在这里添加验证代码对传入的数据做验证    _name = name;}- (NSString* ) name{    return _name;}- (void) setAddress: (NSString *) address{    _address = address;}- (NSString *) address{    return _address;}- (void) setCreateTime: (Date) date{    _createTime = date;}- (Date) createTime{    return _createTime;}- (void)introduction{    NSLog(@"学校名称:%@, 学校地址:%@, 创办时间:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day);}//测试点语法访问非getter-setter方法- (void)test{    NSLog(@"点语法调用无参对象方法");}- (void)test:(int)num{    NSLog(@"测试数据 %i", num);}@end#import <Foundation/Foundation.h>#import "School.h"int main(int argc, const char * argv[]) {        //School * s = [School new];//    s->_name = @"科技大学";//    s->_address = @"XX省XX市XX区XX路XX号";//    s->_createTime.year = 2045;//    s->_createTime.month = 13;//    s->_createTime.day = 34;        Date date = {1990, 1, 1};    School * s = [School new];        s.name = @"test";       // 等效于  [s setName:@"test"];    s.address = @"测试";     // 等效于  [s setAddress:@"测试"];    s.createTime = date;    // 等效于  [s setCreateTime:date];        NSLog(@"学校名:%@, 学校地址:%@", s.name, s.address);    // 等效于  NSLog(@"学校名:%@, 学校地址:%@", [s name], [s address]);        // 点语法调用无参对象方法警告信息: PRoperty access result unused - getters should not be used for side effects    s.test;         // 等效于  [s test];    // 点语法调用带参对象方法 编译直接报错    s.test:111;               [s introduction];        return 0;}

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表