Effective Objective-C 2.0 隨筆
----
理解"類對象用意"
每個對象結(jié)構(gòu)體的首個成員是Classl類的變量拗胜。該變量定義了對象所屬的類董瞻,通常是"is a"指針。例如NSString的對象的isa指針就指向NSString。
Class對象的首個變量也是isa指針,說明Class本質(zhì)是OC對象。Class結(jié)構(gòu)體里還有個super class的變量用于定義本類的超類盗似。而Class的isa則指向元類(metaclass),用來表述對象本身所具備的元數(shù)據(jù)翁涤,"類方法"就定義與此處桥言,因為這些方法可以理解成類對象的實力方法萌踱,每個類僅有一個"類對象"葵礼,而每個"類對象"僅有一個與之相關(guān)的"元類"号阿。
-------------------------
ARC中autorelease的優(yōu)化
ARC會優(yōu)化autorelease后緊跟retain的操作,當(dāng)方法中返回autorelease對象時鸳粉,會先執(zhí)行一個特殊的函數(shù)objc_autoreleaseReturnValue扔涧。此函數(shù)會檢視當(dāng)前方法返回后即將要執(zhí)行的那段代碼。若發(fā)現(xiàn)需要retain届谈,則設(shè)置全局數(shù)據(jù)結(jié)構(gòu)中的一個標(biāo)志位枯夜,而不執(zhí)行autorelease。同理艰山,如果方法返回一個autorelease的對象湖雹,則不需要直接retain,而是改為執(zhí)行objc_retainAutoreleaseReturnValue函數(shù)曙搬。此函數(shù)檢測剛才設(shè)置的標(biāo)志位摔吏,若已經(jīng)置位,就不執(zhí)行retain纵装。設(shè)置和監(jiān)測標(biāo)志位要比autorelease和retain更快征讲。
------------
全局block,棧block橡娄,堆block
全局Block不會捕捉任何狀態(tài)诗箍,運行時也無需有狀態(tài)來參與,block所使用的整個內(nèi)存區(qū)域挽唉,在變異期已經(jīng)完全確定滤祖。因此全局block可以聲明在全局內(nèi)存里,而不需要在每次用到的時候于棧中創(chuàng)建瓶籽。另外匠童,全局block的copy操作是個空操作,因為全局block絕不可能為系統(tǒng)所回收棘劣。這種block實際上相當(dāng)于單例俏让。
-------------
不要使用dispatch_get_current_queue
當(dāng)在隊列B中,獲取當(dāng)前隊列會取得隊列B茬暇,基于這個條件首昔,當(dāng)你此時同步派發(fā)一個block到隊列A,就會造成死鎖糙俗,因為隊列B是從屬于隊列A的勒奇。
所以應(yīng)使用下面的方法:
假如根據(jù)制定的鍵獲取不到關(guān)聯(lián)數(shù)據(jù),那么系統(tǒng)就會沿著層級體系向上查找巧骚,直至找到數(shù)據(jù)或到達根隊列為止赊颠。因此可以知道當(dāng)前隊列是否處于某個特定隊列的層級下格二,可以直接調(diào)用,而不需要派發(fā)導(dǎo)致死鎖竣蹦。
----------------
initialize和load
load方法并不遵從繼承規(guī)則顶猜。如果某個類沒有實現(xiàn)load方法,不管其各級超類是否實現(xiàn)load痘括,系統(tǒng)都不會調(diào)用长窄。當(dāng)分類和類里都有l(wèi)oad,兩種代碼都會調(diào)用纲菌,類的比分類的先執(zhí)行挠日。
initialize為惰性執(zhí)行,當(dāng)程序用到相關(guān)的類時翰舌,才會執(zhí)行嚣潜。否則一直不會被調(diào)用。