《Effective Objective-C 2.0》讀書筆記(一)——熟悉Objective-C

1.了解Objective-C語言的起源

  • 消息結(jié)構(gòu)語言:其運(yùn)行時(shí)所執(zhí)行的代碼由運(yùn)行環(huán)境來決定

  • 函數(shù)調(diào)用語言:編譯器決定

  • Objective-C 采用消息結(jié)構(gòu)

  • 堆棧區(qū)別
    http://blog.csdn.net/a7458969/article/details/6683416

堆棧區(qū)別
其他
  • 深拷貝淺拷貝
    • 淺拷貝碴卧,只是對指針的拷貝弱卡,拷貝后兩個(gè)指針指向同一個(gè)內(nèi)存空間
    • 深拷貝不但對指針進(jìn)行拷貝,而且對指針指向的內(nèi)容進(jìn)行拷貝住册,經(jīng)深拷貝后的指針是指向兩個(gè)不同地址的指針

2.在類的頭文件中盡量少引入其他頭文件

  • #include 容易導(dǎo)致死循環(huán)

  • 除非確有必要婶博,否則不要使用#import

    • 產(chǎn)生相互依賴問題
    • 增加編譯時(shí)間
  • 盡量使用@class(forward declaring)

3.多用字面量語法,少用與之等價(jià)的方法

  • 字面量語法其實(shí)就是語法糖
  • 更簡潔荧飞、易于理解
  • 當(dāng)數(shù)組凡人、字典中有nil,會拋出異常

<pre><code>
-(void)example3_syntacticSugarWithNil{

id object1 = @"object1";

id object2 = nil;

id object3 = @1;

NSArray *arrayWithoutSyntacticSugar = [NSArray arrayWithObjects:object1,object2,object3, nil];

pr_obj(arrayWithoutSyntacticSugar);

NSArray *arrayWithSynacticSugar = @[object1,object2,object3];

pr_obj(arrayWithSynacticSugar);

}
</pre></code>
因?yàn)閍rrayWithObjects:方法依次處理各個(gè)參數(shù)叹阔,直到發(fā)現(xiàn)nil為止挠轴,因?yàn)閛bject2是nil,所以方法會提前結(jié)束耳幢,arrayWithoutSyntacticSugar只包含object1


結(jié)果

使用字面量語法岸晦,當(dāng)有nil時(shí),會拋出異常,應(yīng)用終止執(zhí)行委煤,便于發(fā)現(xiàn)錯(cuò)誤堂油。

但對于很多app來說,app閃退并不是一件好事碧绞,用戶體驗(yàn)不好府框。為了降低閃退率,而不使用字面量語法讥邻。表面上app的閃退率下降了迫靖,但實(shí)際上,為app埋了隱藏的bug兴使,排查bug難度加大系宜。在我看來,寧愿拋出異常出現(xiàn)閃退发魄,也好過掩蓋錯(cuò)誤盹牧,為app埋下炸彈,某個(gè)時(shí)間突然爆炸励幼,一發(fā)不可收拾汰寓。

  • 局限性

    • 如果自定義子類,無法用字面量語法創(chuàng)建對象
    • 使用字面量語法創(chuàng)建出來的字符串苹粟、數(shù)組有滑、字典對象均為不可變

編譯成功:


警告

運(yùn)行后帚豪,閃退:


結(jié)果

4.多用類型常量役听,少用#define預(yù)處理指令

  • #define
    • 沒有類型信息
    • 重新定義常量值,編譯器不會產(chǎn)生警告

<pre><code>#define ANIMATION_DURATION 0.3</pre></code>

  • static const
    • 描述了常量的含義
    • 如果不加static躏救,編譯器默認(rèn)添加extern
    • 如果修改const修飾符聲明的變量苛秕,編譯器會報(bào)錯(cuò)

<pre><code>static const NSTimeInterval kAnimationDuration = 0.3;</pre></code>

  • extern
    • 在頭文件使用extern聲明全局常量肌访,在相關(guān)實(shí)現(xiàn)文件中定義值

<pre><code>extern NSString *const EOCLoginManagerDidLoginNotification;</pre></code>

5.用枚舉表示狀態(tài)、選項(xiàng)艇劫、狀態(tài)碼

  • 枚舉默認(rèn)從0開始

TestConnectionState定義:

<pre><code>
typedef enum {

TestConnectionStateDisconnected,

TestConnectionStateConnecting,

TestConnectionStateConnected,

}TestConnectionState;
</pre></code>
打印枚舉值:
<pre><code>
-(void)example4_enumWithDefault{

pr_int(TestConnectionStateDisconnected);

pr_int(TestConnectionStateConnecting);

pr_int(TestConnectionStateConnected);

}
</pre></code>

結(jié)果
  • 枚舉也可以指定數(shù)值

<pre><code>
typedef enum {

TestConnectionStateStartWithTwoDisconnected = 2,

TestConnectionStateStartWithTwoConnecting = 4,

TestConnectionStateStartWithTwoConnected = 5,

}TestConnectionStateStartWithTwo;
</pre></code>
打印枚舉值:
<pre><code>
-(void)example4_enumStartWithTwo{

pr_int(TestConnectionStateStartWithTwoDisconnected);

pr_int(TestConnectionStateStartWithTwoConnecting);

pr_int(TestConnectionStateStartWithTwoConnected);

}
</pre></code>


結(jié)果
  • 如果把傳遞給某個(gè)方法的選項(xiàng)表示為枚舉類型场靴,而多個(gè)選項(xiàng)又可同時(shí)使用,那么將各個(gè)選項(xiàng)值定義為2的冪港准,通過按位或操作將其組合起來

以UIViewAutoresizing為例,在UIView.h文件中可以看到UIViewAutoresizing的聲明:
<pre><code>
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {

UIViewAutoresizingNone                 = 0,

UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,

UIViewAutoresizingFlexibleWidth        = 1 << 1,

UIViewAutoresizingFlexibleRightMargin  = 1 << 2,

UIViewAutoresizingFlexibleTopMargin    = 1 << 3,

UIViewAutoresizingFlexibleHeight       = 1 << 4,

UIViewAutoresizingFlexibleBottomMargin = 1 << 5

};
</pre></code>
通過按位與咧欣,可以快速判斷是否包含某個(gè)選項(xiàng):
<pre><code>
-(void)example4_UIViewAutoresizing{

UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin;

if(resizing & UIViewAutoresizingFlexibleLeftMargin){

    pr_obj(@"UIViewAutoresizingFlexibleLeftMargin");

}

if(resizing & UIViewAutoresizingFlexibleHeight){

    pr_obj(@"UIViewAutoresizingFlexibleHeight");

}

}
</pre></code>

結(jié)果
  • 用NS_ENUM與NS_OPTIONS宏來定義枚舉類型浅缸,并指明其底層數(shù)據(jù)類型,而不采用編譯器所選的類型
  • (!!!!并沒有任何提示)在處理枚舉類型的switch語句不要實(shí)現(xiàn)default分支魄咕。加入新枚舉后衩椒,編譯器會提示switch語句并未處理所有枚舉

<pre><code>
typedef NS_ENUM(NSInteger,TestSwitchState) {

TestSwitchStateAAA,

TestSwitchStateBBB,

TestSwitchStateCCC,

TestSwitchStateNone,

TestSwitchStateDDD

};
</pre></code>
結(jié)果并沒有任何提示:


結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毛萌,更是在濱河造成了極大的恐慌苟弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阁将,死亡現(xiàn)場離奇詭異膏秫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)做盅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缤削,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吹榴,你說我怎么就攤上這事亭敢。” “怎么了图筹?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵帅刀,是天一觀的道長。 經(jīng)常有香客問我远剩,道長扣溺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任民宿,我火速辦了婚禮娇妓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘活鹰。我一直安慰自己哈恰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布志群。 她就那樣靜靜地躺著着绷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锌云。 梳的紋絲不亂的頭發(fā)上荠医,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音桑涎,去河邊找鬼彬向。 笑死,一個(gè)胖子當(dāng)著我的面吹牛攻冷,可吹牛的內(nèi)容都是我干的娃胆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼等曼,長吁一口氣:“原來是場噩夢啊……” “哼里烦!你這毒婦竟也來了凿蒜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胁黑,失蹤者是張志新(化名)和其女友劉穎废封,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丧蘸,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漂洋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了触趴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮发。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冗懦,靈堂內(nèi)的尸體忽然破棺而出爽冕,到底是詐尸還是另有隱情,我是刑警寧澤披蕉,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布颈畸,位于F島的核電站,受9級特大地震影響没讲,放射性物質(zhì)發(fā)生泄漏眯娱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一爬凑、第九天 我趴在偏房一處隱蔽的房頂上張望徙缴。 院中可真熱鬧,春花似錦嘁信、人聲如沸于样。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穿剖。三九已至,卻和暖如春卦溢,著一層夾襖步出監(jiān)牢的瞬間糊余,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工单寂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贬芥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓宣决,卻偏偏與公主長得像誓军,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子疲扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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