此讀書筆記是本人每日坐地鐵上看書 的總結(jié)土童,本人是一個渣渣溪食,而且剛開始寫博客,所以總結(jié)的肯定有不對的地方娜扇,望各位批評指點,其中不講那些原理了啥的比較虛的栅组,直接上的都是我覺得平時工作開發(fā)中能用的上的干活雀瓢,給有需要的親們分享
第1條:了解objective-c 語言的起源
說白了就是老生常談oc 身為運行時語言較C++ Java的一些好處,動態(tài)綁定技術(shù)玉掸,運行時才會檢查對象類型刃麸,身為一個渣渣來說,這些只是了解司浪,等自己高大上了泊业,才能更好的理解人家這牛逼的地方
第2條:在類的頭文件中禁令少引用其他頭文件
簡單的說就是頭文件在需要的時候在引入,尤其是是在.h文件中盡量不要引入其他頭文件啊易,這樣可以有效的避免循環(huán)引用吁伺,增加編譯時間,在.h文件中盡量多用@class ClassName也就是所謂的向前聲明租谈,盡量把需要遵守的協(xié)議添加到分類中篮奄,如果不行就單獨放一個頭文件,總的來說就是盡量把引入的這件事分開搞割去,如果一個文件引入了好多文件窟却,他在被引用的話,一是編譯慢呻逆,二是容易出循環(huán)引用夸赫。
第3條:多用字面量語法,少用與之等價的方法
字面量語法說白了就是一層語法糖咖城,前代牛逼大神封裝好了茬腿,讓我們方便調(diào)用在創(chuàng)建呼奢,使用字符串,數(shù)值滓彰,數(shù)組控妻,字典的時候最好多用,原因撈干很簡單揭绑,人家大神封裝的時候已經(jīng)內(nèi)部做好了好多判斷弓候,可以拋出很多異常,可以讓大家擼代碼的時候省時省力他匪。
例如:
// 字面量創(chuàng)建的變量
NSString *someString = @"讀書筆記";
// 普通創(chuàng)建
NSString * someString1 = [[NSString alloc]initWithFormat:@"讀書筆記"];
NSNumber * someNumber = @1;
NSNumber * someNumber1 = [NSNumber numberWithInt:1];
NSArray * someArray = @[@"a",@"b",@"c",@"d"];
NSArray * someArray1 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil];
NSDictionary * somedict=@{@"first":@"a",@"Two":@"b"};
NSDictionary * somedict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"first",@"a",@"Two",@"b", nil];
在使用變量的時候也是盡量使用[]語法菇存,方便安全,需要注意的是使用[]語法在使用到其中有nil的時候邦蜜,就會拋異常依鸥,方便排除,還有普通創(chuàng)建的時候如果數(shù)組悼沈,字典中有nil贱迟,則直接當(dāng)成已達到尾端,后面的就不會再操作絮供,而字面量中衣吠,會把nil也當(dāng)成元素填入
第4條:多用類型常量,少用#define預(yù)處理指令
我平時也是經(jīng)常使用#define指令壤靶,看了才知道缚俏,要少用,原因兩個贮乳,一個使用預(yù)處理指令不會只是簡單的替換忧换,不會檢查變量類型;二是如果你設(shè)置了個全局的預(yù)處理變量向拆,如果某人在其他文件里又設(shè)置了個一樣的亚茬,那樣你也不知道,到時候就GG了,所以所以后多用已下方法搞全局變量
在此類中的全局全局聲明
static const int ALLCLASSINT = 5;
在整個工程中的全局聲明,記住要在.h文件中搞哲银,具體的看看C語言的基礎(chǔ)就知道了
extern NSString * const ALLSTRING = @"全局變量";
第5條:用枚舉表示狀態(tài)昆禽、選項、狀態(tài)碼
這個沒啥說的所有語言通用,基礎(chǔ)中的基礎(chǔ)
第6條:理解“屬性”這一概念
原書說了一大堆,說的都是概念,有用的就是iOS開發(fā)中應(yīng)該用@property創(chuàng)建的變量會對其進行封裝設(shè)置get 厨疙、set等,聲明的時候要聲明nonatomic(不加鎖),而不要聲明atomic(加原子鎖)疑务,其他的屬性根據(jù)需要加沾凄,個人覺得即使不多加梗醇,也不要瞎加,如果加錯了反而會照成錯誤
第7條:在對象內(nèi)部盡量直接訪問實例變量
在對象內(nèi)部讀取數(shù)據(jù)時撒蟀,應(yīng)該直接通過實例變量來讀叙谨,而寫入數(shù)據(jù)時,則應(yīng)通過屬性來寫保屯。
簡單的說讀取變量的時候直接用 _abc 方法手负,設(shè)置變量的時候適合用 self.abc 來設(shè)置 在懶加載是應(yīng)該用_abc 不過想要出發(fā)懶加載時應(yīng)該用self屬性來讀取數(shù)據(jù)
第8條:理解“對象等同性”這一概念
oc中==操作符比較的是兩個指針本身,而非所指向的內(nèi)容姑尺,所以oc中提供了很多等同性API供我們使用竟终,class 中有 isEqual,NSString中有isEqutalToString切蟋;NSArray中有isEqualToArray统捶;NSDictionary中有isEqualToDictionary。在判斷時候最好用等同性函數(shù)更加準(zhǔn)確柄粹,還有就是盡量不要修改意見存在數(shù)組或者集合中的指針喘鸟,這樣比較容易讓編譯器做出不符合你預(yù)期的動作,逐條檢測時更加要多多細心
第9條:以“類族模式”隱藏實現(xiàn)細節(jié)
文中講述了用工廠方法創(chuàng)建的對象的好處驻右,
中間后續(xù)再看
第15條:用前綴避免命名空間沖突
因為oc中并沒有C++中的命名空間迷守,以及Java中的jar概念,所以比較容易出現(xiàn)命名沖突這個問題旺入,這個時候解決的辦法是用不同的前綴來避免命名沖突,這樣做的好處不言而喻有效凯力,而且在堆棧信息中查看問題的時候還比較好定位問題
第16條:提供“全能初始化方法”
每個類都應(yīng)該一個全能初始化方法茵瘾,在最終創(chuàng)建的時候都調(diào)用此方法創(chuàng)建類,如果子類里的方法和超類里的方法不同的話咐鹤,應(yīng)該覆蓋超類的方法拗秘,如果方法不適用,那么子類應(yīng)該覆蓋原方法祈惶,并在中間拋異常雕旨。
第17條:實現(xiàn)description方法
自己封裝的類如果從外部直接用nslog打印的話,只能看到默認信息也就是指針值捧请,這個對于調(diào)試并沒有什么亂用凡涩,所以作者推薦在類中實現(xiàn)description方法,這樣在外部用nslog打印的時候就可以顯示出你所需的信息疹蛉,如果想只在模擬器中用控制臺打印信息的話可以調(diào)用debugDescription函數(shù)活箕。
第18條:盡量使用不可變對象
在很多某些情況下,我們接受到了數(shù)據(jù)保存到對象中之后就不需要修改原數(shù)據(jù)了可款,所以作者推薦我們盡量的創(chuàng)建不可變的對象屬性設(shè)置為readonly育韩;如果需要在對象內(nèi)部進行修改克蚂,但是不需要外部修改就可以將readonly屬性變?yōu)閞eadwrite屬性,這樣編譯器就可以很好的起到限定的工作筋讨,還有不要把可變的數(shù)組埃叭,字典,集合作為公開屬性悉罕,要設(shè)置相關(guān)的方法操作這些屬性赤屋。
第19條:使用清晰而協(xié)調(diào)的命名方式
類,方法以及變量的命名是objective-C編程的重要環(huán)節(jié)而且oc中的命名規(guī)則有事與眾不同蛮粮,我們起名時要遵守命名規(guī)范益缎,從左向右讀起來要像個日常用語的句子才好,方法名里不要使用縮略后的類型名稱然想,起名的第一要務(wù)就是確保你自己的代碼或所要集成的框架相符莺奔。
第20條:為私有方法名加前綴
給私有名稱上加上前綴可以和公共方法區(qū)分開,不過不要用一個下劃線作為前綴变泄,因為這個需要預(yù)留給蘋果公司令哟。
第21條:理解objective-c錯誤類型
oc拋異常比較麻煩,所以不能像Java那樣隨便拋異常妨蛹,只有在導(dǎo)致崩潰的時候才應(yīng)該使用異常屏富,一般都是用代理來處理錯誤,放到NSError里蛙卤,由返給調(diào)用者
第22條:理解NSCopying協(xié)議
如果想對自己寫的對象具有copy功能應(yīng)該遵守NSCopying協(xié)議狠半,一般默認執(zhí)行的都是淺拷貝,如果想執(zhí)行深拷貝需要單獨封裝相應(yīng)的方法
第23條:通過委托與數(shù)據(jù)源協(xié)議進行對象間通信
委托所說的就是代理颤难,本節(jié)講述的就是通過代理進行通信神年,不過個人認為代理實現(xiàn)起來還是比較復(fù)雜,如果可以的話還是多用block這個更簡單好用行嗤,而且不會把代碼分散的到處都是已日,不方便查看
第24條:將類的實現(xiàn)代碼分散到便于管理的數(shù)個分類之中
如果一個類功能比較多經(jīng)常容易填滿各種方法非常不善于維護,可以用oc的分類機制來講代碼按邏輯劃入不同的區(qū)域栅屏,這對開發(fā)與調(diào)試都有好處飘千,還有可以把不想暴露出去的私有方法放到名字Private的分類中,可以隱藏實現(xiàn)細節(jié)栈雳,讓使用者無法調(diào)用护奈。
第25條:總是為第三方類的分類名稱加前綴
因為oc為在運行期系統(tǒng)才會加載,所以你自己寫的分類名稱如果和系統(tǒng)自帶的方法或者第三方的分類方法重名的話就會進行覆蓋哥纫,這樣就會造成很大的不便逆济,所以為你自己的分類名稱和方法添加自己的前綴可以避免這種問題。
第26條:勿在分類中聲明屬性
不要把數(shù)據(jù)聲明在分類中應(yīng)該定義在主接口中,如果有需要可以定義存存儲方法奖慌。
第27條:使用分類隱藏實現(xiàn)細節(jié)
中間略過
第31條:在dealloc方法中只釋放引用并解除監(jiān)聽
** -(void)dealloc**函數(shù)是在類真正被銷毀的時候自動調(diào)用抛虫,開發(fā)者不可以主動調(diào)用此類,在ARC下此類無需調(diào)用super方法简僧。所以在此類適合調(diào)用解除監(jiān)聽方法建椰,例如:“鍵值觀測(KVO)” 活NSNotificationCenter等通知,不要做其他事情岛马。原因銷毀方法不可控棉姐,如果在此方法中調(diào)用進行釋放文件資源、系統(tǒng)資源或者開子線程等待回調(diào)等啦逆,就容易出現(xiàn)問題伞矩,因為線程可能未回調(diào)就被kill 或者主線程本身就kill,時間太長的話可能未執(zhí)行就被殺死了夏志。如果要釋放這種較大資源的釋放乃坤,最好自己封裝專門的釋放函數(shù),預(yù)留兩份清理代碼沟蔑。
第32條:編寫“異常安全代碼”時留意內(nèi)存管理問題
當(dāng)拋異常時如果在異常時會存在new了新的類 但是沒等到release的時候就拋異常了湿诊,這時候就無法釋放對象了,所以應(yīng)該講應(yīng)該添加@finally{}方法瘦材,在此方法內(nèi)對class進行釋放厅须。不過上述說的是MRC的情況,如果在ARC的情況下食棕,不會在@finally{}方法中自動調(diào)用release方法朗和,因為這樣會創(chuàng)建大量樣板代碼從而影響性能。如果想要生成這種附加碼需要打開編譯器的-fobjc-arc-exceptions標(biāo)志但是會降低效率簿晓,需要謹(jǐn)記眶拉。
第33條:以弱引用避免保留環(huán)
如果兩個及其以上對象之間進行強引用就會形成保留環(huán)。保留環(huán)的危害就是相互引用會導(dǎo)致互不釋放抢蚀,最后會導(dǎo)致泄漏。避免方法就是將某些引用設(shè)置成weak或者unsafe_unretained镰禾。
兩者的區(qū)別是前者釋放后指向為nil皿曲,后者還指向之前的對象。weak引用可以自動清空吴侦,也可以不自動清空屋休。自動清空是隨著ARC而引入的新特性,由運行期系統(tǒng)來實現(xiàn)备韧。在具備自動清空功能的弱引用上劫樟,可以隨意讀取數(shù)據(jù),因為這種引用不會指向已經(jīng)回收過的對象。
第34條:已“自動釋放池塊”降低內(nèi)存峰值
如果某個代碼塊初始化時創(chuàng)建出一些不需要持續(xù)存在的臨時對象時應(yīng)該提早回收叠艳,增加一個自動釋放池可以解決問題奶陈,在循環(huán)中自動釋放的對象就會放在這個池中,而不是線程的主池里面附较。采用@autoreleasepool{}新式寫法能夠更輕便的創(chuàng)建出自動釋放池吃粒,講此工作交給操作系統(tǒng)省時省力。