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
總結
以上是生活随笔為你收集整理的7、在对象内部尽量直接访问实例变量的全部內容,希望文章能夠幫你解決所遇到的問題。