分類常見面試題
1、分類可以添加屬性嗎?
答:分類可以添加屬性,但是不會自動生成成員變量與get/set方法。但是我們可以通過objc_getAssociatedObject\objc_setAssociatedObject的方式來為UIButton這樣的類添加屬性。
2、假設A類有一個a方法,現(xiàn)在我們又添加一個A1分類,同樣也實現(xiàn)了一個a方法。此時在A類中調用a方法。誰會被調用?為什么?
答:分類中的a方法會被優(yōu)先調用。
原因:在oc語言中,我們的基類NSObject實際是一個Class,該Class是一個objc_class的struct,在這個結構體中維護了我們類中所有的信息,比如methodLists、ivars、protocols,分別對應的是我們所寫的方法列表、成員變量列表、協(xié)議列表。
而分類Category實際上同樣也是一個struct,信息存儲在category_t結構體中,該結構體同樣維護了對象方法列表、類方法列表、協(xié)議列表、屬性列表。多個分類則保存在category_list中。
通過閱讀源碼,實際上我們可以發(fā)現(xiàn),在runtime的初始化函數(shù)中,首先檢測是否包含分類并進行遍歷。在這個過程中會先將多個分類的對象方法列表,類方法列表,協(xié)議列表存放到對應的數(shù)組中。
最后取出原有類中的方法列表與分類的方法列表進行合并操作,我們也可以理解成插入操作。分類中的方法會插入到原有類方法的前面。當然在內(nèi)存中實際上是進行了內(nèi)存移動和內(nèi)存拷貝。這就是為什么分類中的方法會被優(yōu)先調用的原因。在內(nèi)存中原有類的方法仍然存在。