首页 > 7、在对象内部尽量直接访问实例变量

7、在对象内部尽量直接访问实例变量

本文概要:

1、首先给出结论是:除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做。

2、讲解了使用getter、setter的好处。

3、列举了几种上面提到的特殊情况:有时不能使用setter、有时必须使用setter、有时必须使用getter。

注意:在对象之外访问实例变量时总是应该通过属性来做。


 一、除了几种特殊情况外,在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做。

读取时-直接访问: _oldName

设置时-属性访问:self.newName

也就是:self.newName = _oldName;

二、讲解了使用getter、setter的好处

  • 由于不经过OC的方法派发步骤,所以直接访问实例变量的速度当然比较快。在这种情况下,编译器所产生的代码会直接访问保存对象实例变量的那块内存。
  • 直接访问实例变量时,不会调用其setter方法,这就绕过了为相关属性所定义的“内存管理语义”。比方说,如果在ARC下直接访问一个声明为copy的属性,那么并不会拷贝该属性,只会保留新值并释放旧值。
  • 如果直接访问实例变量,那么就不会触发KVO通知。
  • 通过属性来访问有助于排查与之相关的错误,因为可以给getter和setter方法中增加断点,监控该属性的调用者及其访问时机。

因此就引出了本文最开始讲到的折中方案:

在写入实例变量时,通过其setter方法来做,而在读取实例变量时,则直接访问。此方法既能提高读写操作的速度,又能控制对属性的写入操作。之所以要通过setter方法来写入实例变量,其首要原因在于,这样做能够确保相关属性的“内存管理语义”得以贯彻。

三、有时不能使用setter、有时必须使用setter、有时必须使用getter

1、有时不能使用setter的情景:

在初始化方法中总是应该直接访问实例变量。

2、有时必须使用setter的情景:

如果待初始化的实例变量声明在超类中,而我们又无法在子类中直接访问此实例变量的话,那么就需要调用setter方法了。

3、有时必须使用getter的情景:

如果使用的是懒加载的方式来初始化实例变量的,必须通过getter方法来访问属性,否则,实例变量就永远不会初始化。

转载于:https://www.cnblogs.com/cchHers/p/8918844.html

更多相关:

  • 一、前言                               avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢。项目请见:mmDeferred@github   二、API说明          ...

  •     在网上看到的这道题,答案是3次。因此a和b[2]实例化三次对象,就调用了三次构造方法,而*p[2]只定义了指针,并未实例化对象,所以不调用构造方法。  转载于:https://blog.51cto.com/sydugu/1553403...

  • 多线程编程 mind-Mapping保存有一下导图的xmind文件,可直接获取 互斥变量 互斥对象 ptrhead相关接口 条件变量 future异步访问类 async类 promise类 package_task类...

  • 我们在实际开发的过程中,可能需要某些类的成员变量并不是针对每一个对象的,而是针对每一个类而言的,比如在银行中有一个利率数据,我们希望的是,当一个利率改变的时候,所有的对象都能够看到这个改变的数据,并利用它,而不是每一个对象都有一个利率成员变量。这个时候就设计到了静态成员变量。 一. 内存那些事 静态成员变量是存放在静态...

  • volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触...

  •   引子     阅读以下代码,并尝试分析 代码解析 在主线程中,线程Id为1,为线程变量赋值 变量==d6ff开启一个新的task,此时线程Id为4,变量==d6ff,并调用Task1开启一个同步Task3,线程Id为1。变量==d6ff,修改值==f598此时第二步启动的Task1运行,线程Id为4,变量==d6ff,修改值=...

  • 操作系统基础    操作系统是协调、控制、管理计算机硬件资源与软件资源的控制程序 为什么要用操作系统?    1.操作系统可以把复杂的操作简化给用户使用或者应用程序  2.可以让应用程序对计算机硬件竞争变的有序  一套完整的计算机分为:操作系统、应用程序、计算机硬件 编程语言的分类   机械语言:使用二进制让计算机工作   优点:运行...

  • Node.js 中文网Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。http://nodejs.cn/先安装nodejs 在自己的网站项目文件夹根目录...

  • 对象表示方式   1、第一种方式:使用new操作符后跟Object构造函数 var person = new Object();
    person.name = 'Nicholas';
    person.age = 29; 2、对象字面量表示法 var person = {name:'Nicholas',ag...

  • 一、使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章《尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)》一致。 但是在我们这里,由于docker中无法部署sql server,所以我采用了Mysql数据库,顺便...