Category爲何只能加方法不能加成員變量?

最近讀到一篇對Category分析的不錯的文章,文章對Cagegory添加屬性,方法、協議等過程作了詳細介紹,其中一個總結以下:面試

分類的實現原理是將category中的方法,屬性,協議數據放在category_t結構體中,而後將結構體內的方法列表拷貝到類對象的方法列表中。
Category能夠添加屬性,可是並不會自動生成成員變量及set/get方法。由於category_t結構體中並不存在成員變量。經過以前對對象的分析咱們知道成員變量是存放在實例對象中的,而且編譯的那一刻就已經決定好了。而分類是在運行時纔去加載的。那麼咱們就沒法再程序運行時將分類的成員變量中添加到實例對象的結構體中。所以分類中不能夠添加成員變量。
複製代碼

裏面對爲何不能添加成員變量的結論做者提到是由於:bash

成員變量是存放在實例對象中的,而且編譯的那一刻就已經決定好了。而分類是在運行時纔去加載的。
複製代碼

那麼爲何成員變量在編譯時決定好了,運行時就很差添加了呢? 實際上是由於對成員變量的查找是經過指針地址偏移進行查找的,而對應的偏移是在編譯時期就肯定好的。查找方式參見一道高級iOS面試題(runtime方向)post

相關文章
相關標籤/搜索