ios底層原理總結–oc物件的本質(一) - 掘金
ios底層原理總結–oc物件的本質(二) - 掘金
ios底層原理總結–oc物件的分類:instance、class、meta-calss物件的isa和superclass - 掘金
ios底層原理總結-- kvo/kvc的本質 - 掘金
思考: 如果我的student有三個成員變數 那麼會占用對少個位元組? (class_getinstancesize([student class]) 的輸出是多少? malloc_size((__bridge const void *)stu的輸出是多少? )
#import #import ///> student類
@inte***ce student: nsobject
///> 實際底層的結構體 結構
//struct student_impl
@end
@implementation student
@end
///> main
int main(int argc, char * argv)
return 0;
}
首先**下一為什麼malloc_size的輸出為32 ?
可以使用xcode自帶的工具去檢視 系統分配的記憶體和使用的記憶體情況。
然後選擇:debug --> degug workflow --> view memory
在下方的位置輸入我們剛剛得到的記憶體位址後就可以了,stu的記憶體結構如上圖所示
直到紅線的位置都是stu所開闢的儲存空間,直到紅色數線後才有了新的值, 在之前都是00值而且在記憶體中記憶體是連續的, 所以我們可以認為,直到紅色豎線位置之前都是stu所分配的儲存空間
如上圖所示
由上圖分析:我們可以得出 stu實際上在記憶體中分配了32個位元組的記憶體空間 也就是 malloc_size() 所輸出的開闢記憶體空間的位元組數。
接下來**下一為什麼class_getinstancesize的輸出為24 ?
class_getinstancesize 顧名思義 獲取類的例項大小
isa占用8個 + _no:4個 + _age4個 + _gender4個
@inte***ce student: nsobject /// 計算相加後 為20個,
結構體存在乙個記憶體對其的操作,這樣有利於cpu的訪問,
在co中用到的記憶體對其的一條規則就是:
結構體為了保證記憶體對其 最重的真用記憶體一定是占用最大的乙個變數的倍數, 在這裡我們isa占用了8個位元組數, 所以雖然實際上只使用了20個位元組,但是為了保證記憶體對其的規則 所以使用了24個位元組,
如果我們有4個成員變數的話:
@inte***ce student: nsobject /// 計算相加後 為24個,
我們真用的記憶體還是24,開闢依舊是32個位元組。
如果在增加乙個成員變數的話:
@inte***ce student: nsobject /// 計算相加後 為28個,
為了保證記憶體對其所以大小為32個位元組,開闢依舊是32個位元組。
malloc_size() 也運用了記憶體對其的 上篇文章中解釋了為什麼給類的記憶體分配了16個位元組, 由於記憶體對其的原因所以stu類分配了32個位元組。
iOS底層原理總結 OC物件的本質 一
窺探ios底層實現 oc物件的本質 一 掘金 窺探ios底層實現 oc物件的本質 二 掘金 窺探ios底層實現 oc物件的分類 instance class meta calss物件的isa和superclass 掘金 窺探ios底層實現 kvo kvc的本質 掘金 int main int arg...
iOS底層原理總結 OC方法的本質
int main int argc,const char argv return 0 可以看出在我們進行lgperson初始化的時候,我們都知道會呼叫alloc,init.我這裡為了簡單只呼叫 new 但是底層不是像我們利用呼叫的,而是呼叫了乙個函式objc msgsend這就是我們訊息傳送的方法,...
iOS 類的底層原理
首先我們探索來例項物件 類物件 元類之間的關係,執行下面 可以看到class1 class2 class3列印結果一樣,我們是不是可以認為類物件只有乙個,元類是乙個虛擬的類由系統幫我們建立,是類物件所屬的類,而元類歸屬是根元類,根元類的歸屬是自身。例項物件 person p person alloc...