iOS_Runtime_OC对象在堆内存中开辟内存的大小

本文详细介绍了Objective-C中对象在堆内存中如何开辟空间,包括占用的内容大小和对象实例变量在堆中的地址分析。通过示例代码展示了如何获取对象大小,并探讨了不同类型的实例变量(对象类型与非对象类型)在堆内存中的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇主要介绍OC中对象在堆内存中如何开辟空间, 以及占用的内容大小.

核心API

头文件: objc/runtime.h
涉及API:

/** 函数 */
class_getInstanceSize

代码

int main(int argc, const char * argv[]) {
    @autoreleasepool {

#pragma mark - 对象及对象的实例变量在堆中的地址
        /**
         * 定义Person类: 实例变量可见度为 @public
         * 详见 Person类 文件
         */

        /** 创建对象Person1, 并赋值 */
        Person *person1 = [[Person alloc] init];
        person1->_name = @"zhangsan";
        person1->_sex = @"male";
        person1->_age = 18;

#pragma mark - 显示对象大小的函数
        /** 直接显示 对象大小 . 需要导入<objc/runtime.h> 文件 */
        NSLog(@"size:%ld", class_getInstanceSize([person1 class]));

        NSLog(@"---%d---(person1)对象和对象的实例变量在堆中的地址---", __LINE__);
        NSLog(@"person1      add:%p", person1);
        NSLog(@"person1 name add:%p", &person1->_name);
        NSLog(@"person1 age  add:%p", &person1->_age);
        NSLog(@"person1 sex  add:%p", &person1->_sex);

        NSLog(@"---如果实例变量类型是对象类型, 指针内容是一个指针---");
        NSLog(@"---%d---(person1)实例变量的指针指向的地址---", __LINE__);
        NSLog(@"person1 name contant :%p", person1->_name);
        NSLog(@"person1 sex  contant :%p", person1->_sex);
        NSLog(@"字符串(zhangsan)   add:%p", @"zhangsan");
        NSLog(@"字符串(male)       add:%p", @"male");  /**< 结论实例变量的指针最终指向了字符串常量首地址 */

        NSLog(@"---如果实例变量类型是非对象类型, 指针内容即为值---");
        NSLog(@"person1 age  contant :%ld", (long)person1->_age);
        NSLog(@"person1 age  contant :%ld", person1->_age);


        /** 创建另一个对象Person2 */
        Person *person2 = [[Person alloc] init];
        person2 = person1;

        NSLog(@"---%d---(person2)对象和对象的实例变量在堆中的地址---", __LINE__);
        NSLog(@"person2      add:%p", person2);
        NSLog(@"person2 name add:%p", &person2->_name);
        NSLog(@"person2 age  add:%p", &person2->_age);
        NSLog(@"person2 sex  add:%p", &person2->_sex);  /**< 结论.person2 指向了person1的首地址person2 的实例变量地址也指向person1 的实例变量首地址 */

        NSLog(@"---%d---(person2)实例变量的指针指向的地址---", __LINE__);
        NSLog(@"person2 name contant :%p", person2->_name);
        NSLog(@"person2 sex  contant :%p", person2->_sex);
        NSLog(@"字符串(zhangsan)   add:%p", @"zhangsan");
        NSLog(@"字符串(male)       add:%p", @"male");


        /* 使用copy方法创建person3 对象 */
        Person *person3 = [person1 copy];

        NSLog(@"---%d---(person3)对象和对象的实例变量在堆中的地址---", __LINE__);
        NSLog(@"person3      add:%p", person3);
        NSLog(@"person3 name add:%p", &person3->_name);
        NSLog(@"person3 age  add:%p", &person3->_age);
        NSLog(@"person3 sex  add:%p", &person3->_sex);


        NSLog(@"---%d---(person3)实例变量的指针指向的地址---", __LINE__);
        NSLog(@"person3 name contant :%p", person3->_name);
        NSLog(@"person3 sex  contant :%p", person3->_sex);
        NSLog(@"字符串(zhangsan)   add:%p", @"zhangsan");
        NSLog(@"字符串(male)       add:%p", @"male");

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值