本人有若干成套學(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)知識, 之前我也寫了幾篇小文章, 大家湊合著看吧:
- 利用runtime獲取類方法, 類協(xié)議, 類成員變量及其應(yīng)用
- 利用runtime更改textField的placeholder字體顏色
- 利用runtime和KVC完成對象的序列化和反序列化
- 利用 Runtime(運行時)講解字典轉(zhuǎn)模型的核心算法