续上一篇文章的介绍,这篇文章就诞生可。建议先看objective - c中类的数据结构,因这两部分的内容是不能断的,建议先去看看。
接下来的主题是objective - c中实例所占内存的大小。
以下都是以64位上分析的。
先定义这样的一个类:
//类的申明 @ interface SizeObject: NSObject { @private int _no;//int _age; } @end//类的实现 @ implementation SizeObject @end
主要是给SizeObject添加一个成员变量int _no;
运行如下代码:
- (void) objSize {//class_getInstanceSize方法需要导入头文件# import & lt; objc/runtime.h> NSLog (@ % zd, % zd, class_getInstanceSize ([NSObject类]),class_getInstanceSize ((SizeObject类)));//打印结果:8、16 }
结论:NSObject的实例对象占用的内存大小是8个字节,然后添加一个int类型的之后的SizeObject的实例独享所占用的内存大小是16个字节。这是什么原因呢?
通过objective - c中类的数据结构知道对于NSOject中有一个成员变量类isa,其实类是一个指针类型,除此之外没有其它的成员变量,故NSObject的实例的内存大小为8个字节是必然。然而,为什么SizeObject的为什么是16个字节呢?仅仅是多了一个int类型的成员变量而已,int仅仅是4个字节而已。接下来将以上的代码int _age;也打开,运行代码SizeObject的大小还是16个字节,是否多一个int成员变量没有什么变化。主要原因是地址对齐原则决定的。
以上给出的的类中成员变量中的占用空间来决定的,确切的说是是通过类的内存布局决定的,也就是成员变量。但是在实际的+ alloc之后的一个实例对象中会占用多少内存地址呢?还有一个函数能malloc_size能计算出系统实际分配的内存空间,代码如下:
- (void) objectSize {//一个alloc之后的对象 NSObject * obj=[NSObject alloc];//malloc_size需导入# import & lt; malloc/malloc.h> NSLog (@ % zd, % zd, class_getInstanceSize ([NSObject类]),malloc_size ((__bridge void *) obj));//打印结果:8、16 }
打印结果尽然是:8 6。说明在实际被+ alloc出来的对象并非是8,而是16。但是如果把-objectSize方法中的NSObject换成SizeObject的话,打印是:16日16。貌似两个函数的结果是一样的。对的,就NSObject是一个特例,现在是不是很想试一试NSProxy的了,结论是与NSObject是一样的。
那么问题来:为什么会这样呢?