0x00 引用自?禪與 Objective-C 編程藝術(shù)?與劉亞芳博客
0x01 什么是setter和getter
在OC里, 為實(shí)例變量賦值的方法稱(chēng)作setter(設(shè)置器)
讀取實(shí)例變量值的方法稱(chēng)作getter(訪(fǎng)問(wèn)器)
0x02 setter 和 getter的書(shū)寫(xiě)格式
OC里規(guī)定里setter和getter的書(shū)寫(xiě)格式
如果一個(gè)實(shí)例變量是 int age只嚣;或者int_age祈搜;
setter的書(shū)寫(xiě)格式如下?
- (void)setAge:(int)age;
即set+首字母大寫(xiě)的實(shí)例變量名(忽略下劃線(xiàn))
getter的書(shū)寫(xiě)格式如下到腥,?
-(int)age;
?即返回值類(lèi)型與變量類(lèi)型一致,方法名與實(shí)例變量名相同(忽略下劃線(xiàn))
0x03 setter和getter與實(shí)例變量的關(guān)系
無(wú)論setter還是getter內(nèi)部操作的是實(shí)例變量
每一個(gè)實(shí)例變量都需要一對(duì)setter和getter方法
0x04 setter和getter的好處
你應(yīng)該總是使用 setter 和 getter 方法訪(fǎng)問(wèn)屬性白嘁,除了init和dealloc方法捶箱。通常智什,使用屬性讓你增加了在當(dāng)前作用域之外的代碼塊的可能所以可能帶來(lái)更多副作用
你總應(yīng)該用 getter 和 setter 因?yàn)椋?br>
使用 setter 會(huì)遵守定義的內(nèi)存管理語(yǔ)義(strong,weak,copyetc...) 這回定義更多相關(guān)的在A(yíng)RC是錢(qián),因?yàn)樗冀K是相關(guān)的丁屎。舉個(gè)例子荠锭,copy每個(gè)時(shí)候你用 setter 并且傳送數(shù)據(jù)的時(shí)候,它會(huì)復(fù)制數(shù)據(jù)而不用額外的操作
KVO 通知(willChangeValueForKey,didChangeValueForKey) 會(huì)被自動(dòng)執(zhí)行
更容易debug:你可以設(shè)置一個(gè)斷點(diǎn)在屬性聲明上并且斷點(diǎn)會(huì)在每次 getter / setter 方法調(diào)用的時(shí)候執(zhí)行晨川,或者你可以在自己的自定義 setter/getter 設(shè)置斷點(diǎn)证九。
允許在一個(gè)單獨(dú)的地方為設(shè)置值添加額外的邏輯。
你應(yīng)該傾向于用 getter:
它是對(duì)未來(lái)的變化有擴(kuò)展能力的(比如共虑,屬性是自動(dòng)生成的)
它允許子類(lèi)化
更簡(jiǎn)單的debug(比如愧怜,允許拿出一個(gè)斷點(diǎn)在 getter 方法里面,并且看誰(shuí)訪(fǎng)問(wèn)了特別的 getter
它讓意圖更加清晰和明確:通過(guò)訪(fǎng)問(wèn) ivar_anIvar你可以明確的訪(fǎng)問(wèn)self->_anIvar.這可能導(dǎo)致問(wèn)題妈拌。在 block 里面訪(fǎng)問(wèn) ivar (你捕捉并且 retain 了 sefl 即使你沒(méi)有明確的看到 self 關(guān)鍵詞)
它自動(dòng)產(chǎn)生KVO 通知
0x05 Warning 不要在Init和dealloc中使用 getter和setter
你永遠(yuǎn)不能在 init (以及其他初始化函數(shù))里面用 getter 和 setter 方法拥坛,并且你直接訪(fǎng)問(wèn)實(shí)例變量。事實(shí)上一個(gè)子類(lèi)可以重載sette或者getter并且嘗試調(diào)用其他方法,訪(fǎng)問(wèn)屬性的或者 ivar 的話(huà)猜惋,他們可能沒(méi)有完全初始化丸氛。記住一個(gè)對(duì)象是僅僅在 init 返回的時(shí)候,才會(huì)被認(rèn)為是初始化完成到一個(gè)狀態(tài)了著摔。同樣在 dealloc 方法中(在 dealloc 方法中缓窜,一個(gè)對(duì)象可以在一個(gè) 不確定的狀態(tài)中)這是同樣需要被注意的。