OC中一个NSObject 对象占用多少内存?
- 系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
- 但NSObject内部只是用来8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
- 32位时,一个指针对象占用 4 个字节
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
@interface Person : NSObject
{
@public
int _no;
int _age;
}
@end
@implementation Person
@end
/*
// 这是转成c++后的代码
struct Person_IMPL {
struct NSObject_IMPL NSObject_IVARS;
int _no;
int _age;
};
// NSObject_IMPL 中只有一个isa指针
struct NSObject_IMPL {
Class isa;
};
// Peron的底层实现 - 相当于
struct Person_IMPL {
Class isa;
int _no;
int _age;
}
*/
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person->_no = 4;
person->_age = 15;
NSLog(@"%zd", class_getInstanceSize([Person class])); // 16
NSLog(@"%zd", malloc_size((__bridge const void *)person)); // 16
}
return 0;
}
复制代码
为什么64位系统中指针的大小是8,而32位的是4?
因为一个字节是8位:1byte= 8bit
- 64位系统,这个位数指的是 CPU 里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64;
- 所以
sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8
- 32位系统,同理,它的一个地址占32位二进制空间;
sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4
- lKB = 1024B(Byte)
为什么一个类的实例只存储它的成员变量而不存它的方法?
- 因为一个类可以有很多个实例;
- 不同实例的成员变量是可以不同的;
- 但是方法是相同的;
- 所有的方法都存放在类对象的实例中
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END