NSObject内存探索
对象的定义
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
注: 拥有isa指针的结构体都是对象,因此类也是对象(类对象),实例也是对象(实例对象)
属于同一个类的实例对象的isa指针指向同一个类对象
NSObject *aObject = [[NSObject alloc]init];
NSObject *bObject = [[NSObject alloc]init];
Class aNSObjectClass = [NSObject class];
打个断点观察一下:
memoryList.png
这里可以看到其isa 指针都指向NSObject,但像我这样的还是喜欢看内存
look memory operate.png ![allocation.png](https://img.haomeiwen.com/i2031664/10c5c5002e154c85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)重复查看内存步骤,可以看到不同对象的isa指针确实指向同一块内存地址
你也可以通过一下方法直接获取isa指针:
Ivar ivar = class_getInstanceVariable([NSObject class], "isa");
Class isa = object_getIvar(aObject, ivar);
Class isa = [aObject valueForKey:@"isa"];
ivar属于更底层的api, kvc则更偏向于上层,二者一一对应
NSObject实例对象所占内存大小
size_t NSObject_size =
class_getInstanceSize([NSObject class]);
通过上述代码获取实例对象size,其答案是8,查看上面的内存视图,你会发现这8个字节刚好是isa指针所占的8个字节,那么一个NSObject 实例对象就是8个字节大小吗,我写了段代码测试一下:
for (int i = 0; i < 1000 * 1000; i++) {
[[NSObject alloc]init];
}
上述代码在MRC
模式下运行, 如果是8个字节的话,那么执行这段代码会增加8M的内存,可我通过观察发现其增长的内存接近16M,看起来更像占16字节。
注: 使用Xcode直接观察内存变化,只能得到一个大概的值。
于是我使用Instrument Allocations 观察内存分配:
allocation.png
发现确实是16字节
额外的8个字节去哪了
这又是一个有趣的问题,最后查阅资料得到了答案: 原来在对象创建的时候,如果所占内存不足16字节,那么也会分配16字节
网友评论