OC对象的本质一

这里写图片描述
我们平时编写的OC代码,底层实现都是C\C++代码,如何看到我们OC代码底层实现的C\C++代码呢!
终端指向Xcode中main.m的上一级目录
终端打印

clang -rewrite-objc main.m -o main.cpp

clang 是苹果内置的编程语言的编译器前端
-rewrite-objc 重新Objc代码,写为C或者C++代码
-o输出 -o main.cpp输出main.cpp (cpp指C plus plus 即C++)

因为一份OC代码跑到iPhone上面和跑在mac上面编译成的C++和汇编语言是不一样的.因为硬件不一样.不同平台支持的代码肯定不一样.还有是针对于iOS有
模拟器(架构i386),
32bit(架构armv7),
64bit(架构arm64),
一般我们要指定平台

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 

这个是针对arm64的手机生成的代码
Xcode工具指定sdk为iphone 架构为arm64,输出文件为main-arm64.cpp发现main-arm64.cpp比main.cpp小的多,因为指定了具体平台

这里写图片描述

1一个NSObject对象占用多少内存
系统分配了16个字节给NSObject对象(通过malloc_size函数获得),但是NSObject对象内部只适用了8个字节的空间(64bit环境下,可以通过class_GetInstanceSize函数获得)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
一个16进制位代表4个二进制位,
2个16进制位代表8个二进制位.
一个字节是8个二进制位
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

创建一个实例对象,至少需要多少内存?
#import<objc/runtime.h>
class_getInstanceSize([NSObject class]);

创建一实例对象,实际上分配了多少内存?
#import<malloc/malloc.h>
malloc_size((_bridge const void *)obj)

OC对象的分类
OC中的对象,简称OC对象,主要分为3种
instance对象(实例对象)
这里写图片描述
class对象(类对象)
这里写图片描述
这里写图片描述
meta-class对象(元类对象)
这里写图片描述
这里写图片描述

 1 Class objc_getClass(const char *aClassName)
  1> 传入字符串类名
  2> 返回对应的类对象
2 Class object_getClass(id obj)
   1> 传入的obj可能是instance对象,class对象,meta-class对象
   2> 返回值
         a> 如果是Instance对象,返回class对象;
         b> 如果是class对象,返回meta-class对象;
         c> 如果是meta-class对象,返回NSObject(基类)的meta-class对象
3 -(Class) class, +(Class) class
   1> 返回的就是类对象

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值