菜鳥讀《Effective objective-c 2.0》 極簡讀書筆記(持續(xù)更新)

此讀書筆記是本人每日坐地鐵上看書 的總結(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)省時省力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒课,一起剝皮案震驚了整個濱河市徐勃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌早像,老刑警劉巖僻肖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卢鹦,居然都是意外死亡臀脏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門法挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谁榜,“玉大人,你說我怎么就攤上這事凡纳∏灾玻” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵荐糜,是天一觀的道長巷怜。 經(jīng)常有香客問我,道長暴氏,這世上最難降的妖魔是什么延塑? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮答渔,結(jié)果婚禮上关带,老公的妹妹穿的比我還像新娘。我一直安慰自己沼撕,他們只是感情好宋雏,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著务豺,像睡著了一般磨总。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笼沥,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天蚪燕,我揣著相機與錄音娶牌,去河邊找鬼。 笑死馆纳,一個胖子當(dāng)著我的面吹牛诗良,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厕诡,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼累榜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灵嫌?” 一聲冷哼從身側(cè)響起壹罚,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寿羞,沒想到半個月后猖凛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡绪穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年辨泳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玖院。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡菠红,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出难菌,到底是詐尸還是另有隱情试溯,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布郊酒,位于F島的核電站遇绞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏燎窘。R本人自食惡果不足惜摹闽,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐健。 院中可真熱鬧付鹿,春花似錦、人聲如沸蚜迅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慢叨。三九已至纽匙,卻和暖如春务蝠,著一層夾襖步出監(jiān)牢的瞬間拍谐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轩拨,地道東北人践瓷。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像亡蓉,于是被迫代替她去往敵國和親晕翠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容