Category為什麼只能加方法不能加成員變數?

d_d發表於2019-04-06

最近讀到一篇對Category分析的不錯的文章,文章對Cagegory新增屬性,方法、協議等過程做了詳細介紹,其中一個總結如下:

分類的實現原理是將category中的方法,屬性,協議資料放在category_t結構體中,然後將結構體內的方法列表拷貝到類物件的方法列表中。
Category可以新增屬性,但是並不會自動生成成員變數及set/get方法。因為category_t結構體中並不存在成員變數。通過之前對物件的分析我們知道成員變數是存放在例項物件中的,並且編譯的那一刻就已經決定好了。而分類是在執行時才去載入的。那麼我們就無法再程式執行時將分類的成員變數中新增到例項物件的結構體中。因此分類中不可以新增成員變數。
複製程式碼

裡面對為什麼不能新增成員變數的結論作者提到是因為:

成員變數是存放在例項物件中的,並且編譯的那一刻就已經決定好了。而分類是在執行時才去載入的。
複製程式碼

那麼為什麼成員變數在編譯時決定好了,執行時就不好新增了呢? 其實是因為對成員變數的查詢是通過指標地址偏移進行查詢的,而對應的偏移是在編譯時期就確定好的。查詢方式參見一道高階iOS面試題(runtime方向)

相關文章