懶加載
當(dāng)實(shí)例化一個(gè)對(duì)象可能耗費(fèi)很多資源的蛤奥,或者需要只配置一次并且有一些配置方法需要調(diào)用点弯,而且你還不想弄亂這些方法盐碱。
在這個(gè)情況下,我們可以選擇使用重載屬性的 getter 方法來做 lazy 實(shí)例化玉锌。通常這種操作的模板像這樣:
- (NSDateFormatter *)dateFormatter {
if (!_dateFormatter) {
_dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSS"];
}
return _dateFormatter;
}
即使在一些情況下這是有益的名挥,但是我們?nèi)匀唤ㄗh你在決定這樣做之前經(jīng)過深思熟慮,事實(shí)上這樣是可以避免的主守。下面是使用 延遲實(shí)例化的爭議禀倔。
- getter 方法不應(yīng)該有副作用榄融。在使用 getter 方法的時(shí)候你不要想著它可能會(huì)創(chuàng)建一個(gè)對(duì)象或者導(dǎo)致副作用,事實(shí)上救湖,如果調(diào)用 getter 方法的時(shí)候沒有涉及返回的對(duì)象愧杯,編譯器就會(huì)放出警告:getter 不應(yīng)該產(chǎn)生副作用
- 你在第一次訪問的時(shí)候改變了初始化的消耗,產(chǎn)生了副作用鞋既,這回讓優(yōu)化性能變得困難(以及測試)
- 這個(gè)初始化可能是不確定的:比如你期望屬性第一次被一個(gè)方法訪問力九,但是你改變了類的實(shí)現(xiàn),訪問器在你預(yù)期之前就得到了調(diào)用邑闺,這樣可以導(dǎo)致問題跌前,特別是初始化邏輯可能依賴于類的其他不同狀態(tài)的時(shí)候《妇耍總的來說最好明確依賴關(guān)系舒萎。
- 這個(gè)行為不是 KVO 友好的。如果 getter 改變了引用蹭沛,他應(yīng)該通過一個(gè) KVO 通知來通知改變。當(dāng)訪問 getter 的時(shí)候收到一個(gè)改變的通知很奇怪章鲤。