day1 关于NSObject

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)

为什么一个类的实例只存储它的成员变量而不存它的方法?

  1. 因为一个类可以有很多个实例;
  2. 不同实例的成员变量是可以不同的;
  3. 但是方法是相同的;
  4. 所有的方法都存放在类对象的实例中
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享