OC对象的本质

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码
所以Objective-C的面向对象都是基于CC++的数据结构实现的(结构体)

将Objective-C代码转换为C\C++代码

xcrun  -sdk  iphoneos  clang  -arch  arm64  -rewrite-objc  OC源文件  -o  输出的CPP文件

如果需要链接其他框架,使用-framework参数。比如-framework UIKit
什么平台的代码
不同平台支持的代码肯定是不一样
Windows. mac、 ios
模拟器(i386)、32bit(armv7)、64bit(arm64)

一个OC对象在内存中是怎么布局的

NSObject 的底层实现
@interface NSObject {
    Class isa;
}
@end
对应:
struct NSObject_IMPL {
    Class isa;
}

typedef struct objc_class * Class;

一个Student对象

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

struct Student_IMPL {
    Class isa;
    int _no;
    int _age;
}

一个Person对象、一个Student对象占用多少内存空间?
继承的话: 子类中肯定有一个父类的结构

实时查看内存中的数据

在Xcode- Debug workfllow- View Memory
tip

输入对应对象的内存地址

使用LLDB指令

iOS中常用的LLDB指令
在这里插入图片描述

两个容易混淆的函数

#import <objc/runtime.h>
#import <malloc/malloc.h>
// 创建一个实例对象,至少需要多少内存
// 获得NSObject实例对象的成员变量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));

// 创建一个实例对象, 实际上分配了多少内存
// 获得obj指针所指向内存的大小 >> 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));

Core Foundation 内部规定:对象最少16个字节;如果小于16 直接等于16
内存对齐机制:结构体的大小必须是最大成员大小的倍数

常见面试题

一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
tip: 大端 小端 (cpu)

iOS中都是小端模式: 读数据是从高地址开始读的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值