Effective Objective-C 2.0_讀書筆記

1.OC使用動(dòng)態(tài)綁定的消息結(jié)構(gòu)枢舶,在運(yùn)行時(shí)才會(huì)檢查對(duì)象類型
接受消息后,要執(zhí)行什么代碼替久,由運(yùn)行期環(huán)境而非編譯器決定
對(duì)于多態(tài)的方法凉泄,將在運(yùn)行期按照虛方法表查出到底應(yīng)該執(zhí)行哪個(gè)函數(shù)的實(shí)現(xiàn)
分配在堆中的內(nèi)存(eg.對(duì)象)必須直接管理,分配在棧上用于保存變量的內(nèi)存在棧幀彈出時(shí)自動(dòng)清理

2.多使用字面量語法創(chuàng)建 @表示字面量
字符串 @“1” 數(shù)值@1 數(shù)組@[@"1",@"2"] 字典@{@"age":@28}
多使用取下標(biāo)操作訪問數(shù)組或字典元素蚯根,如array[1]后众、dictionary[@"age"]

3.使用NS_ENUM 與 NS_OPTIONS 宏定義枚舉類型
指明其底層數(shù)據(jù)類型胀糜,可確保枚舉為所選的底層數(shù)據(jù)類型實(shí)現(xiàn)的
NS_ENUM 枚舉間不需要相互組合
NS_OPTIONS 按位或操作來組合的枚舉,各選項(xiàng)定義為2的冪
在處理枚舉類型的switch語句中不要實(shí)現(xiàn)default分支

//預(yù)定義將源代碼中的ANIMATION_DURATION替換為 0.3?
#define ANIMATION_DURATION 0.3?
//這樣聲明的變量帶有類型信息蒂誉,描述了常量的含義
?static const NSTimeInterval kAnimationDuration = 0.3;

常見關(guān)鍵字
const 聲明只讀變量教藻,表示將對(duì)象轉(zhuǎn)換成一個(gè)常量,若試圖修改由const 修飾的變量右锨,編譯器會(huì)報(bào)錯(cuò)
static 聲明靜態(tài)變量括堤,意味著該變量?jī)H在定義此變量的.m文件中可見
extern 聲明變量會(huì)出現(xiàn)在全局符號(hào)表中,其他文件可見
typedef 用以給數(shù)據(jù)類型取別名
union 聲明共用數(shù)據(jù)類型
volatile 說明變量在程序執(zhí)行中可被隱含地改變

4.向前聲明
在A中引用B绍移,在A的頭文件中寫 @class B悄窃;實(shí)現(xiàn)文件中再#import "B.h"

5.對(duì)象 — 基本構(gòu)造單元
@property = ivar + getter + setter;
除了生成方法代碼 getter、setter 之外蹂窖,編譯器還要自動(dòng)向類中添加適當(dāng)類型的實(shí)例變量轧抗,并且在屬性名前面加下劃線,以此作為實(shí)例變量的名字瞬测。
通過對(duì)象横媚,存儲(chǔ)并傳遞數(shù)據(jù),在對(duì)象之間傳遞數(shù)據(jù)并執(zhí)行任務(wù)叫做消息傳遞
將所需數(shù)據(jù)保存為各種實(shí)例變量月趟,屬性用于封裝對(duì)象中的數(shù)據(jù)
@synthesize 關(guān)鍵字用來指定實(shí)例變量的名字
@dynamic 關(guān)鍵字告訴編譯器不要自動(dòng)創(chuàng)建實(shí)現(xiàn)屬性所用的實(shí)例變量灯蝴,也無需創(chuàng)建存取方法

6.直接訪問實(shí)例變量 _firstName 不會(huì)調(diào)用其“設(shè)置方法”,不會(huì)觸發(fā)KVO
訪問屬性 self.firstName
寫入實(shí)例變量時(shí)狮斗,通過其“設(shè)置方法” self.
讀取實(shí)例變量時(shí)绽乔,直接訪問實(shí)例變量 _
若采用懶加載(屬性不常用,且創(chuàng)建屬性的成本較高碳褒,所以延遲加載)
必須通過讀取屬性 self.

7.對(duì)象等同性
== 操作比較的是兩個(gè)指針本身
若想檢測(cè)對(duì)象等同性折砸,重寫 isEqual:和 hash 方法

8.類族模式可將實(shí)現(xiàn)細(xì)節(jié)隱藏在一套簡(jiǎn)單的公共接口后面

9.在既有類中使用關(guān)聯(lián)對(duì)象存放自定義數(shù)據(jù)
單純用繼承的方法擴(kuò)展屬性,有時(shí)可能無法創(chuàng)建自己所寫子類
給對(duì)象關(guān)聯(lián)其他對(duì)象沙峻,用鍵區(qū)分屬性

//存取方法
void objc_setAssociatedObject(idobject,void*key,idvalue,objc_AssociationPolicypolicy);
objc_getAssociatedObject(idobject,void*key);

10.objc_msgSend
OC動(dòng)態(tài)性:所有的方法在底層都是普通的C語言函數(shù)睦授,對(duì)象收到消息之后,究竟該調(diào)用哪個(gè)方法摔寨,完全在運(yùn)行期決定去枷,也可在運(yùn)行期改變
此函數(shù)會(huì)依據(jù)接收者與選擇子的類型來調(diào)用適當(dāng)方法
現(xiàn)在接收者所屬的類中搜索其方法列表找到則執(zhí)行是复,找不到沿著繼承體系向上查找删顶,找到后執(zhí)行;若還是找不到淑廊,執(zhí)行消息轉(zhuǎn)發(fā)
每個(gè)類中都有一張表格逗余,選擇子為查表時(shí)所用的鍵

11.消息轉(zhuǎn)發(fā) objc _msgForward


消息轉(zhuǎn)發(fā)流程

12.類的方法列表會(huì)把選擇子的名稱映射到相關(guān)的方法實(shí)現(xiàn)上 SEL —> IMP

13.程序運(yùn)行到斷點(diǎn)處,開發(fā)者可向console輸入命令季惩,po 對(duì)象打印

14.每個(gè)OC對(duì)象實(shí)例都是指向某塊內(nèi)存數(shù)據(jù)的指針录粱,所以聲明變量時(shí)腻格,類型后跟一個(gè) * 字符
在運(yùn)行期檢視對(duì)象類型 —> 類型信息查詢,可查出對(duì)象是否能響應(yīng)某個(gè)選擇子啥繁,是否遵從某項(xiàng)協(xié)議菜职,位于類繼承體系的哪一部分
每個(gè)對(duì)象結(jié)構(gòu)體的首個(gè)成員是Class類的變量,定義了對(duì)象所屬的類旗闽,稱 isa 指針酬核,類型信息查詢中使用isa指針獲取對(duì)象所屬的類

15.為類提供一個(gè)全能初始化方法,其他的初始化方法都要調(diào)用它
提供類的全能初始化方法宪睹,當(dāng)?shù)讓訑?shù)據(jù)存儲(chǔ)機(jī)制改變時(shí)愁茁,只需修改此代碼蚕钦,無需改動(dòng)其他初始化方法
每個(gè)類的全能初始化方法都應(yīng)調(diào)用其超類的對(duì)應(yīng)方法

16.盡量創(chuàng)建不可變的對(duì)象
為私有方法名加前綴亭病,將其同公共方法區(qū)分開
OC的動(dòng)態(tài)性使其無法再編譯時(shí)就確定哪個(gè)方法公用,哪個(gè)方法私有嘶居,要在運(yùn)行時(shí)罪帖,運(yùn)行期檢查對(duì)象能響應(yīng)的方法

17.只有發(fā)生了可使整個(gè)應(yīng)用崩潰的嚴(yán)重錯(cuò)誤時(shí),才應(yīng)使用異常
在出現(xiàn)非致命錯(cuò)誤時(shí)邮屁,處理為讓方法返回nil / 0
用NSError處理
Error domain 錯(cuò)誤范圍 整袁、產(chǎn)生錯(cuò)誤的根源
Error code 錯(cuò)誤碼
User info 用戶信息
通過委托協(xié)議來傳遞此錯(cuò)誤,或經(jīng)“輸出參數(shù)”返回給調(diào)用者

- (BOOL)doSomething:(NSError**)error;   //error是個(gè)指針佑吝,且該指針本身又指向另外一個(gè)指針?

NSError *error = nil;
Bool ret = [object doSomething:&error];
if(error){...}     //若不關(guān)注具體出錯(cuò)原因坐昙,直接判斷ret即可if(ret){...}

18.NSCopying協(xié)議/NSMutableCopying協(xié)議
遵循這個(gè)協(xié)議,對(duì)象應(yīng)該實(shí)現(xiàn)如下方法

-(id)copyWithZone:(NSZone*)zone
//可變版本
-(id)mutableCopyWithZone:(NSZone*)zone

對(duì)于一些不可變對(duì)象芋忿,copy直接賦予對(duì)象的引用炸客,保證一致性,因?yàn)椴恢匦麻_辟空間戈钢,節(jié)約內(nèi)存痹仙;但是對(duì)于可變對(duì)象,copy將重新生成一個(gè)一模一樣的對(duì)象殉了,各改各的开仰,防止造成數(shù)據(jù)錯(cuò)亂。
簡(jiǎn)單做個(gè)試驗(yàn)薪铜,對(duì)字符串進(jìn)行copy众弓、mutableCopy,對(duì)可變字符串進(jìn)行copy隔箍、mutableCopy后谓娃,輸出其地址
驗(yàn)證copy、mutableCopy

可變字符串與其copy指向同一塊內(nèi)存區(qū)域

可以發(fā)現(xiàn)鞍恢,對(duì)于不可變對(duì)象傻粘,copy會(huì)直接賦予對(duì)象的引用每窖,不生成新對(duì)象,而對(duì)于不可變對(duì)象弦悉,copy窒典、mutableCopy都會(huì)生成新對(duì)象。

19.通過委托和數(shù)據(jù)源協(xié)議進(jìn)行對(duì)象間通信
用 respondsToSelector: 來判斷委托對(duì)象是否實(shí)現(xiàn)了相關(guān)方法
調(diào)用 delegate 對(duì)象中的方法時(shí)稽莉,應(yīng)該把發(fā)起委托的實(shí)例也一并傳入方法中

20.分類的目的在于擴(kuò)展類的功能瀑志,而非封裝數(shù)據(jù)

  • 向無源碼的既有類中新增功能
  • 分類不支持添加屬性和成員變量,勿在分類中聲明屬性污秆,應(yīng)把封裝數(shù)據(jù)所用的全部屬性都定義在主接口里
  • 若在分類中聲明屬性劈猪,需要將其聲明為@dynamic,存取方法等到運(yùn)行期再提供
  • 分類中的方法是在運(yùn)行期系統(tǒng)將分類方法加入類良拼,直接添加在類里面的战得,類似于類的固有方法
  • 將類的實(shí)現(xiàn)代碼分散到便于管理的數(shù)個(gè)分類之中
  • 通過給分類加前綴、給分類中的方法名加前綴的方法庸推,避免分類與分類常侦,分類與本來的類方法覆蓋

21.m 文件中的@interface 叫 class-continuation分類
將私有方法的原型、類中所遵循的不為人知的協(xié)議 在class-continuation中聲明
.mm 擴(kuò)展名表示編譯器將此文件按Objective-C++來編譯

在Objective-C中贬媒,runtime會(huì)自動(dòng)調(diào)用每個(gè)類的兩個(gè)方法聋亡,兩個(gè)方法都只會(huì)被調(diào)用一次。

+(void)load會(huì)在類初始加載時(shí)調(diào)用
+(void)initialize惰性調(diào)用际乘。

保證在足夠早的時(shí)間點(diǎn)被調(diào)用,將
didFinishLaunchingWithOptions 中的第三方中的注冊(cè)代碼坡倔、推送初始化方法挪到+ (void)load 中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脖含,隨后出現(xiàn)的幾起案子罪塔,更是在濱河造成了極大的恐慌,老刑警劉巖器赞,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垢袱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡港柜,警方通過查閱死者的電腦和手機(jī)请契,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夏醉,“玉大人爽锥,你說我怎么就攤上這事∨先幔” “怎么了氯夷?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)靶擦。 經(jīng)常有香客問我腮考,道長(zhǎng)雇毫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任踩蔚,我火速辦了婚禮棚放,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馅闽。我一直安慰自己飘蚯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布福也。 她就那樣靜靜地躺著局骤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暴凑。 梳的紋絲不亂的頭發(fā)上峦甩,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音搬设,去河邊找鬼穴店。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拿穴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忧风,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼默色,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了狮腿?” 一聲冷哼從身側(cè)響起腿宰,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缘厢,沒想到半個(gè)月后吃度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贴硫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年椿每,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片英遭。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡间护,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挖诸,到底是詐尸還是另有隱情汁尺,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布多律,位于F島的核電站痴突,受9級(jí)特大地震影響搂蜓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辽装,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一洛勉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧如迟,春花似錦收毫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玲销,卻和暖如春输拇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贤斜。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工策吠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘩绒。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓猴抹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锁荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蟀给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 第四章 協(xié)議與分類 協(xié)議和分類都是OC中非常好的特性,善用這些功能會(huì)大大增加我們代碼的效率阳堕。 23. 通過委托與數(shù)...
    Miridescent閱讀 418評(píng)論 0 2
  • 第一章 熟悉Objective-C 1.OC的起源 oc使用了消息結(jié)構(gòu)而非函數(shù)調(diào)用跋理。使用消息結(jié)構(gòu)的語言,其運(yùn)行時(shí)...
    醬油不愛醋閱讀 354評(píng)論 0 6
  • 第三章 15. 用前綴避免命名空間沖突 選擇與你的公司恬总、應(yīng)用程序或二者皆有關(guān)聯(lián)之名稱作為類名的前綴前普,并在所有代碼中...
    醬油不愛醋閱讀 209評(píng)論 0 4
  • 許多人為了提高觀影體驗(yàn)和所謂的真實(shí)感走進(jìn)影院,而這一切都會(huì)在每個(gè)人的內(nèi)心深處就建立這個(gè)不過是廠電影的體會(huì)...
    懿曦l逆塵閱讀 182評(píng)論 1 0
  • 號(hào)稱是二胎家庭必讀的育兒經(jīng)壹堰,幾個(gè)月前看過一遍拭卿,心想快生的時(shí)候再重溫下,現(xiàn)在看來缀旁,許多經(jīng)驗(yàn)已經(jīng)內(nèi)化了记劈,對(duì)我來說不新鮮...
    石上清泉閱讀 1,211評(píng)論 0 0