zoukankan      html  css  js  c++  java
  • 在对象内部尽量直接访问实例变量

    本文概要:

    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方法来访问属性,否则,实例变量就永远不会初始化。

  • 相关阅读:
    cf359D Pair of Numbers
    cf671B Robin Hood
    [暑假集训--数位dp]hdu5787 K-wolf Number
    [暑假集训--数位dp]UESTC250 windy数
    [暑假集训--数位dp]LightOj1205 Palindromic Numbers
    [暑假集训--数位dp]LightOJ1140 How Many Zeroes?
    [暑假集训--数位dp]LightOj1032 Fast Bit Calculations
    [暑假集训--数位dp]hdu5898 odd-even number
    [暑假集训--数位dp]cf55D Beautiful numbers
    [暑假集训--数位dp]hdu3709 Balanced Number
  • 原文地址:https://www.cnblogs.com/cchHers/p/8918844.html
Copyright © 2011-2022 走看看