01.01OC对象的本质

1. 一个NSObject对象占用多少内存?

  1. 系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
  2. NSObject对象内部只使用了8个字节的空间(可以通过class_getInstanceSize函数获得)

在这里插入图片描述

NSObject *obj = [[NSObject alloc]init];

//获得NSObject类的实例对象的成员变量所占用的大小 : 8 ,存放的isa指针
    NSLog(@"%zd",class_getInstanceSize([NSObject class])); // 8
    NSLog(@"%zd",class_getInstanceSize([obj class]));//8
/*
     size_t class_getInstanceSize(Class cls)
     {
         if (!cls) return 0;
         return cls->alignedInstanceSize();
     }
     
     // Class's ivar size rounded up to a pointer-size boundary.类的成员变量所占用的大小
     uint32_t alignedInstanceSize() const {
         return word_align(unalignedInstanceSize());
     }
 */
     
      // 获得obj指针所指向内存的大小
    NSLog(@"%zd",malloc_size((__bridge const void*) obj)); //16 分配了16个字节的大小
    //#import <malloc/malloc.h>
    //分配大小的时候,如果大小不足16个字节,就强制分配16个字节.
    
    //分配了16个字节的大小,被利用起来的只有8个字节的大小


1.student的内存大小

内存大小是父类结构体的实现,加上自身的成员变量的大小

@interface Student : NSObject
{
    @public
    int _no;
    int _age;
}
@end

// 转成结构体就是
struct Student_impl {
    Class isa;//isa继承至NSObject 
    int _no;
    int _age;
};
// 一个类的大小 包括父类结构体的实现,和成员变量

NSLog(@"%zd",class_getInstanceSize([Student class]));//16
    NSLog(@"%zd",malloc_size( (__bridge const void *)student));//16
//可以把student转换成结构体指针
struct Student_impl *stuimpl = (__bridge struct Student_impl *)student;
    
    NSLog(@"_no is %d,_age is %d",stuimpl->_no,stuimpl->_age); //4 5

如果给student添加一个成员变量

@interface Student : NSObject
{
    @public
    int _no;
    int _age;
    int _ui; //新加
}

NSLog(@"%zd",class_getInstanceSize([Student class])); 
//  24 内存对齐过的 ,最大成员大小(isa=8字节)的倍数

NSLog(@"%zd",malloc_size( (__bridge const void *)student)); 
    //  32 16的倍数

结构体的大小必须是最大成员大小的倍数
isa的大小是8,所以大小是8的倍数


2. 一个Person对象、一个Student对象占用多少内存空间?

16 16

在这里插入图片描述

2.两个容易混淆的函数

//创建一个实例对象,至少需要多少内存
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
//创建一个实例对象,实际上分配了多少内存
#import <malloc/malloc.h>
malloc_size((__bridge const void*)obj);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值