NSArray内存布局

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

那么,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的内存布局:顺序存储对象的指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值