OC 中setter與getter與實例變量的關(guān)系

0x00 引用自?禪與 Objective-C 編程藝術(shù)?與劉亞芳博客


0x01 什么是setter和getter

在OC里, 為實例變量賦值的方法稱作setter(設(shè)置器)

讀取實例變量值的方法稱作getter(訪問器)


0x02 setter 和 getter的書寫格式

OC里規(guī)定里setter和getter的書寫格式

如果一個實例變量是 int age;或者int_age;

setter的書寫格式如下?

- (void)setAge:(int)age;

即set+首字母大寫的實例變量名(忽略下劃線)

getter的書寫格式如下,?

-(int)age;

?即返回值類型與變量類型一致,方法名與實例變量名相同(忽略下劃線)


0x03 setter和getter與實例變量的關(guān)系

無論setter還是getter內(nèi)部操作的是實例變量

每一個實例變量都需要一對setter和getter方法

0x04 setter和getter的好處

你應(yīng)該總是使用 setter 和 getter 方法訪問屬性,除了init和dealloc方法。通常,使用屬性讓你增加了在當(dāng)前作用域之外的代碼塊的可能所以可能帶來更多副作用

你總應(yīng)該用 getter 和 setter 因為:

使用 setter 會遵守定義的內(nèi)存管理語義(strong,weak,copyetc...) 這回定義更多相關(guān)的在ARC是錢,因為它始終是相關(guān)的。舉個例子,copy每個時候你用 setter 并且傳送數(shù)據(jù)的時候,它會復(fù)制數(shù)據(jù)而不用額外的操作

KVO 通知(willChangeValueForKey,didChangeValueForKey) 會被自動執(zhí)行

更容易debug:你可以設(shè)置一個斷點在屬性聲明上并且斷點會在每次 getter / setter 方法調(diào)用的時候執(zhí)行,或者你可以在自己的自定義 setter/getter 設(shè)置斷點。

允許在一個單獨的地方為設(shè)置值添加額外的邏輯。

你應(yīng)該傾向于用 getter:

它是對未來的變化有擴展能力的(比如,屬性是自動生成的)

它允許子類化

更簡單的debug(比如,允許拿出一個斷點在 getter 方法里面,并且看誰訪問了特別的 getter

它讓意圖更加清晰和明確:通過訪問 ivar_anIvar你可以明確的訪問self->_anIvar.這可能導(dǎo)致問題。在 block 里面訪問 ivar (你捕捉并且 retain 了 sefl 即使你沒有明確的看到 self 關(guān)鍵詞)

它自動產(chǎn)生KVO 通知


0x05 Warning 不要在Init和dealloc中使用 getter和setter


你永遠不能在 init (以及其他初始化函數(shù))里面用 getter 和 setter 方法,并且你直接訪問實例變量。事實上一個子類可以重載sette或者getter并且嘗試調(diào)用其他方法,訪問屬性的或者 ivar 的話,他們可能沒有完全初始化。記住一個對象是僅僅在 init 返回的時候,才會被認為是初始化完成到一個狀態(tài)了。同樣在 dealloc 方法中(在 dealloc 方法中,一個對象可以在一個 不確定的狀態(tài)中)這是同樣需要被注意的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容