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)中)這是同樣需要被注意的。