NSArray記憶體布局,nsarray布局
Objective-C的數組比C++,Java的數組強大在於,NSArray儲存的對象可以是不同的對象。但只能儲存對象,int ,char,double等基礎資料型別 (Elementary Data Type)不能直接儲存,需要通過轉換成對象才能加入數組。
那麼,OC是如何做到儲存不同的對象的呢?NSMutableArray繼承自NSArray,他又是如何進行插入和刪除操作的呢?如何儲存的是對象本身,是鏈式儲存還是順序儲存?如果是順序儲存,那麼插入和刪除操作豈不是很麻煩?
首先,NSArray儲存的是對象的指標,而非對象本身。這樣的話,NSArray就可以儲存不同的對象的指標;這樣對話,NSMutableArray進行插入和刪除操作也不會太麻煩(畢竟指標佔用的空間小);那麼NSArray是如何儲存的呢?
Student *stu = [[Studentalloc] init];
Student *stu1 = [[Studentalloc] init];
Student *stu2 = [[Studentalloc] init];
Student *stu3 = [[Studentalloc] init];
NSArray *arr = @[stu,stu1,stu2,stu3];
NSLog(@"\narr1 is %p\narr2 is %p\narr3 is %p\narr4 is %p",[arrobjectAtIndex:0],[arrobjectAtIndex:1],[arrobjectAtIndex:2],[arrobjectAtIndex:3]);
運行結果如:
看到這裡,我頓時淩亂裡,這也不連續啊?這裡列印的其實是裡面元素的地址。
view of memory "arr"得到:
第一個地址0x 01 00 30 01 10是NSArray中isa指標
第二個地址0x 01 00 11 0a 60 是arr4的地址
第三個地址0x 01 00 20 00 10 是arr3的地址
......
好了,到這裡為止,我們知道了nsarray的記憶體布局:順序儲存物件的指標