開篇先看幾道思路題,帶著問題閱讀會更能激起大腦的思考。當然,如果你看完思考題後,心裡已經有答案了,恭喜你已經深入理解了((* ̄︶ ̄))。
分類的主要作用的是為已經存在的類新增方法。此外,在實際開發中,有如下應用場景:
從記憶體管理的角度上看,在執行期,物件的記憶體布局已經確定,如果新增例項變數就會破壞現有的布局。
從原始碼的角度上看呢,
typedef struct category_t category_t;
複製**
從分類的定義上可以清楚的知道分類可以幹什麼,它可以新增例項方法、類方法、協議及屬性。
分類被附加到類上是在map_images的時候發生的。首先所有分類的方法列表會被拼成乙個總的新方法列表(newlists);再將類中原有的方法列表複製到新方法列表中;部分**片段如下:
for (uint32_t m = 0;
(scanforcustomrr || scanforcustomawz) && m < mlist->count;
m++)
else
if (scanforcustomawz && isawzselector(sel))
}// fill method list array
newlists[newcount++] = mlist;..
.// copy old methods to the method list array
for (i = 0; i < oldcount; i++)
複製**
到這裡我們可以知道,所謂的方法覆蓋,原有的方法並沒有消失,只是他在方法列表中的索引後於分類中的方法。而執行時方法查詢是順著方法列表順序查詢的。所以如果要調原方法也很簡單,順著方法列表找到最後乙個對應名字的方法就是原方法。
load方法的呼叫順序有兩條規則:父類先於子類呼叫,類先於分類呼叫。
那麼,在多個分類的情況下呢?取決於編譯器中的compile sources中的順序。而後編譯的,在"同名覆蓋"的情況下,方法會先被找到。
在分類中,編譯器無法自動幫我們把屬性所需的例項變數合成出來。在實際操作中,我們可以通過向屬性的訪問方法提供管理物件來達到同樣的目的。
前文已經分析過,在執行期,類的記憶體空間都已經確定。關聯物件勢必另外開闢了記憶體,那麼這個內存在哪,又是如何與類關聯的呢?
class associationsmanager
~associationsmanager
()
associationshashmap &associations
() };
複製**
所有的關聯物件都有associationsmanager管理,裡面通過乙個全域性map來儲存。map的key是這個物件的指標位址,value是另乙個map,儲存了關聯物件的鍵值對。
void *objc_destructinstance(id obj)
return obj;
}複製**
當物件銷毀時,objc_destructinstance會判斷這個物件有沒有關聯物件,如果有,會呼叫_object_remove_assocations清理管理物件。 深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...