編寫高質(zhì)量iOS和OS X代碼的52個有效方法
本篇博客主要是自己的一些筆記,如果要了解詳細(xì)介蛉,還請閱讀書本萌庆。推薦H芡省1揖伞!
第一章筆記 ?(書中提到的class-continuation分類是指.m文件的私有擴(kuò)展猿妈,并非category)
1. 盡量用@class來做”向前聲明”吹菱,在需要的時候import
減少使用者引入的頭文件數(shù)量,如果引用的頭文件用不到彭则,會增加編譯時間;
import還有可能導(dǎo)致循環(huán)引用的問題
2. 協(xié)議的遵守最好放在類的私有擴(kuò)展當(dāng)中
3. 關(guān)于oc中的協(xié)議
和java中的接口類似 ?鳍刷,用于對象之間相互通信的同時,又能解耦俯抖;
委托模式的遵旨:定義一套接口输瓜,代理對象遵守此接口。原來對象就可以給代理回傳一些信息芬萍,也可以在發(fā)生相關(guān)事件時通知代理尤揣;
此模式可以講數(shù)據(jù)和業(yè)務(wù)邏輯解耦; 例如 “數(shù)據(jù)源” 和 “委托” ?。
聲明代理用weak柬祠,避免保留環(huán)的形成北戏;因?yàn)橐话闱闆r代理對象會持有原對象;
設(shè)計方法時一般將原來對象傳給代理; 這樣代理能根據(jù)實(shí)例執(zhí)行不同的代碼漫蛔;
緩存委托對象嗜愈,如果協(xié)議中的方法都是可選的旧蛾,那么程序中可能會有一大堆, responseToSelector,這時候可以把某個委托對象是否能夠響應(yīng)某個協(xié)議緩存起來蠕嫁;優(yōu)化程序效率;
自己總結(jié):用該模式來實(shí)現(xiàn)不同對象間的異步通信锨天;比如網(wǎng)絡(luò)請求,不知道什么時候回來剃毒;一些UI事件不知道什么時候觸摸時绍绘;該模式在通信時是低耦合的,代理一般是id迟赃;
4. 多用字面量 少用與之等價的方法
多用NSString *someStr = @"abcd"; 少用NSString *someStr2 = [NSString stringWithFormat....];NSNumber NSArray NSDictionary都是如此
代碼整潔 便于閱讀 ?沒有多余的語法成分
數(shù)組用字面量的好處:
id obj1 = /…/
id obj2 = /…/
id obj3 = /…/
NSArray *arrA = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];
NSArray *arrB = @[obj1, obj2, obj3]
// 上邊的代碼中如果obj2是nil陪拘,arrB會拋出異常,原因是數(shù)組中有空對象纤壁;而arrA數(shù)組中只有obj1一個對象左刽,原因是通過方法創(chuàng)建數(shù)據(jù),結(jié)束標(biāo)志就是nil酌媒;
局限性: 利用字面量創(chuàng)建可變版本時候需要拷貝一份
NSMutableArray *mutable = [@[@1, @2, @3] mutableCopy]
5. 多用類型常量 少用#define
利用static和extern來管理作用域
// .h文件
extern NSString *const SomeStr;
// .m 文件
NSString *const someStr = @"someStr";
6. 用枚舉表示狀態(tài) 選項(xiàng) 狀態(tài)碼 ?
每個枚舉值可以用1<<0, 1<<1欠痴,來賦值;這樣用"按位或操作符"組合多個枚舉的二進(jìn)制值秒咨;例如系統(tǒng)的UIViewAutoresizing.
如果用枚舉表示狀態(tài)機(jī)喇辽,在switch語句中最好不要有default語句.