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]);
运行结果如下图:
看到这里,我顿时凌乱里,这也不连续啊?这里打印的其实是里面元素的地址。
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的内存布局:顺序存储对象的指针