#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 = ;
s->_createTime.month = ;
s->_createTime.day = ; [s introduction];
return ;
}

如果成员变量是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 = {, , };
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 = {, , };
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:; [s introduction]; return ;
}

OC基础--对成员变量的封装的更多相关文章

  1. OC基础--成员变量的封装

    一.封装的作用: 1.重用 2.不必关心具体的实现 3.面向对象三大特征之一 4.具有安全性 二.OC中成员变量的命名规范以及注意事项 1.命名规范--.成员变量都以下划线“_”开头 1)为了跟get ...

  2. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  3. 黑马程序员——OC基础 三种特性之封装

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1)  set方法 1&g ...

  4. C#-面向对象的三大特性——封装(封装成员变量、封装成员方法)

    封装: 封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 封装的意义在于保护或者防止代码(数据)被我们无意中破坏. 封装既可以封装成员变量,又可以封装成 ...

  5. OC基础7:变量和数据类型

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时候初始化需要让对象带有初始值,那么 ...

  6. C++基础之 成员变量初 始化赋值

    摘要: C++成员变量 初始化赋值 你都清楚吗?还有好多坑,好多细节也不知道... 今天在写一个类的时候,由于该类的一个成员变量是引用,所以初始化出现了问题,查了一下之后,才发现,原来引用的初始化和c ...

  7. OC开发系列-成员变量的作用域

    成员变量的作用域 OC中成员变量有四种作用域,同时每一种作用域对应着响应的关键字. * @private:自能在当前类的实现@implementation中访问 * @protected: 可以在当前 ...

  8. 【java基础】成员变量和局部变量02

    成员变量和局部变量(2) 成员变量的初始化和内存中的运行机制         当系统加载类或者创建类的实例的时候,系统会自动为成员变量分配内存空间,并自动指定初始值. package object; ...

  9. 【java基础】成员变量和局部变量

    成员变量和局部变量 根据定义变量位置的不同,可以将变量分为成员变量和局部变量        成员变量是在类范围内定义的变量        局部变量是在一个方法内定义的变量   成员变量可以分为:   ...

随机推荐

  1. [地图SkyLine二次开发]框架(2)

    上节讲到,地图加载. 但我们可以发现,当没有页面布局的情况下,<OBJECT>控件,没有占满整个屏幕,这里我们就要用到Extjs的功能了. 这节要讲的是用Extjs为<OBJECT& ...

  2. ubuntu 编译源码坏境配置

    git checkout -b newlocal origin/q01v31source build/envsetup.shlunch msm8916_32-usermake -j4 make -j4 ...

  3. 有关宏定义的bug

    #define max(a,b) a>b?a:b 这个宏有诸多缺点:当调用比如max(3,2)*2时会出现不想要的结果.按理来说,我们想要得到的结果是:3*2=6,但是由于优先级的问题,得到的结 ...

  4. C语言局部变量和全局变量的区别。——Arvin

    局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因:  1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨 ...

  5. python爬虫实战(一)——实时获取代理ip

    在爬虫学习的过程中,维护一个自己的代理池是非常重要的. 详情看代码: 1.运行环境 python3.x,需求库:bs4,requests 2.实时抓取西刺-国内高匿代理中前3页的代理ip(可根据需求自 ...

  6. 兼容cookie和webStorage

    html页面     <!DOCTYPE html> <html lang="en"> <head>     <meta charset= ...

  7. monkeyrunner自动化测试

    通过MonkeyRunner遍历apk文件夹里的apk文件,实现自动安装应用,打开应用,截图,将截图与提前准备好的基线图做对比,对比相似度达到90%时,则对比通过,然后自动卸载应用,进入下一个APK文 ...

  8. jQuery Mobile学习日记之HelloWorld

    这里是本人学习jQuery Mobile的过程,主要用于记录,过程中有不对的地方或不严谨的地方,欢予以指出纠正,非常感谢! 1.首先是下载安装以下文件: [Opera Mobile Emulator] ...

  9. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  10. 渐变算法的 Java 实现

    /** * 指定长度的渐变. * @param c0 起始颜色. * @param c1 结束颜色. * @param len 受限的渐变长度,为保证每一个颜色都不一样,会根据颜色找出长度最大值. * ...