NSArray内存储器布局

NSArray内存布局

Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

那么,OC是如何做到保存不同的对象的呢?NSMutableArray继承自NSArray,他又是如何进行插入和删除操作的呢?如何保存的是对象本身,是链式存储还是顺序存储?如果是顺序存储,那么插入和删除操作岂不是很麻烦?

首先,NSArray保存的是对象的指针,而非对象本身。这样的话,NSArray就可以保存不同的对象的指针;这样对话,NSMutableArray进行插入和删除操作也不会太麻烦(毕竟指针占用的空间小);那么NSArray是如何存储的呢?

Student *stu = [[Student alloc] init];

Student *stu1 = [[Student alloc] init];

Student *stu2 = [[Student alloc] init];

Student *stu3 = [[Student alloc] init];

NSArray *arr = @[stu,stu1,stu2,stu3];

NSLog(@"\narr1 is %p\narr2 is %p\narr3 is %p\narr4 is %p",[arr objectAtIndex:0],[arr objectAtIndex:1],[arr objectAtIndex:2],[arr objectAtIndex:3]);

运行结果如下图:

NSArray内存储器布局

看到这里,我顿时凌乱里,这也不连续啊?这里打印的其实是里面元素的地址。

view of memory "arr"得到:

NSArray内存储器布局

第一个地址0x 01 00 30 01 10是NSArray中isa指针

第二个地址0x 01 00 11 0a 60 是arr4的地址

第三个地址0x 01 00 20 00 10 是arr3的地址

......

好了,到这里为止,我们知道了nsarray的内存布局:顺序存储对象的指针