<EffectiveObjective-C2.0編寫高質(zhì)量iOS與OS X代碼的52個有效方法>讀書筆記(二)

本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

  • 內(nèi)存管理語義是很重要的, 面試也會經(jīng)常問到:
    下面的這段話是書中的內(nèi)容, 我覺得很重要, 先copy過來了:

★ assign "設(shè)置方法" 只會執(zhí)行針對"純量類型" (scalar type, 例如CGFloat 或 NSInteger等) 的簡單賦值操作.

★ strong 此特質(zhì)表明該屬性定義了一種"擁有關(guān)系" (owning relationship). 為這種屬性設(shè)置新值時, 該設(shè)置會先保留新值, 并釋放舊值, 然后再將新值設(shè)置上去.

★ weak 此特質(zhì)表明該屬性定義了一種"非擁有關(guān)系" (nonowning relationship). 為這種屬性設(shè)置新值時, 設(shè)置方法既不保留新值, 也不釋放舊值, 此特質(zhì)同assign類似, 然而在屬性所指的對象遭到摧毀時, 屬性值也會清空(nil out).

★ unsafe_unretained 此特質(zhì)的語義和assign相同, 但是它適用于"對象類型"(object type), 該特質(zhì)表達(dá)一種"非擁有關(guān)系" ("不保留", unretained), 當(dāng)目標(biāo)對象遭到摧毀時, 屬性值不會自動清空("不安全", unsafe), 這一點與weak有區(qū)別.

★ copy 此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似. 然而設(shè)置方法并不保留新值, 而是將其"拷貝" (copy). 當(dāng)屬性類型為NSString *時, 經(jīng)常用此特質(zhì)來保護(hù)其封裝性, 因為傳遞給設(shè)置方法的新值有可能指向一個NSMutableString類的實例. 這個類是NSString的子類, 表示一種可以修改其值的字符串, 此時若是不拷貝字符串, 那么設(shè)置完屬性之后, 字符串的值就可能會在對象不知情的情況下遭人更改. 所以, 這時就要拷貝一份"不可變" (immutable)的字符串, 確保對象中的字符串值不會無意間變動. 只要實現(xiàn)屬性所用的對象是"可變的" (mutable), 就應(yīng)該在設(shè)置新屬性值時拷貝一份.

這些特性, 如果是系統(tǒng)默認(rèn)生成的getter, setter方法的話, 會默認(rèn)實現(xiàn)相關(guān)語義, 但是, 如果是重寫setter方法, 則要注意保證具備相關(guān)屬性所聲明的特質(zhì).

例如, 如果某個屬性聲明為copy, 那么久應(yīng)該在setter方法中拷貝相關(guān)對象.除了在setter方法中需要拷貝相關(guān)對象, 在初始化方法中也同樣需要如此, 比方說你定義了一個初始化方法:

- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName {
    if(self = [super init]) {
        _firstName = [firstName copy];
        _lastName = [lastName copy];   
    }
}

這里就產(chǎn)生了一個疑問, 能不能直接用self.firstName = firstName來賦值屬性? 這樣就可以貫徹語義了, 但這又牽扯到另外一個問題, 就是什么時候用屬性賦值, 什么時候用實例變量賦值了.

這本書的作者建議我們:

  • 在對象內(nèi)部讀取數(shù)據(jù)時, 應(yīng)該直接通過實例變量來讀, 而寫入數(shù)據(jù)時, 則應(yīng)該通過屬性來寫.
  • 初始化方法以及dealloc方法中, 總是應(yīng)該直接通過實例變量來讀寫數(shù)據(jù).
  • 有時會使用懶加載配置某份數(shù)據(jù), 這種情況下, 需要通過屬性來讀取數(shù)據(jù)

這一章剩下的章節(jié)為我們介紹了運行時的相關(guān)知識, 之前我也寫了幾篇小文章, 大家湊合著看吧:

PS. 本人有若干成套學(xué)習(xí)視頻, 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

最后編輯于
?著作權(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)容