OC对象

202 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

前言

image.png

  • objc4可编译源码

  • 想要了解本质,需要用ClangOC的类编译为底层的C/C++

  • Clang是基于LLVMC/C++/Object-C的编译器,相当于是LLVM的前端

  • 把⽬标 main.h⽂件编译成c++⽂件

clang -rewrite-objc main.m -o main.cpp  
  • UIKit报错问题: 注意SDK版本
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot /
Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m 
  • xcrun命令在clang的基础上进⾏了⼀些封装,要更好⽤⼀些
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o 
main-arm64.cpp (模拟器) 
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o mainarm64.cpp (⼿机) 

对象是什么

  • xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc WLWPerson.m -o WLWLPerson.cppWLWPerson.m 编译生成 WLWPerson.cpp

image.png

  • 打开WLWPerson.cpp, 发现代码非常的长,很难阅读。我们可以根据自己熟悉的类进行搜索定位,检索WLWPerson

1 图一

  • 可以看出WLWPerson实际是objc_object对象的本质是objc_object结构体

对象底层结构

  • 打开objc4源码,检索objc_object

image.png 图二

  • 可以看出结构体内部有一个 Class isa 指针, 正好也对应了《图一》,WLWPerson内部除自己属性生成的_nickname成员变量外,还有一个NSObject_IVARS,所以对象第一个成员变量是一个isa指针, 我们可以打印一来验证一下

image.png

  • 在没有赋值nickname之前p前8个字节已有值这个值就是isa, 再将nickname赋值

image.png

  • 可以看出第二个值就是我们的nickname

  • 以上可以看出。对象内存结构跟成员变量有关系

image.png

总结

  • 根据以上我们可以得出,对象的本质是一个objc_object结构体
  • 存在在对象第一个是isa
  • 对象的内存结构跟成员变量有关系

疑问

  • 对象内部的成员变量是如何存储的
  • 对象的内存大小是多少
  • 对象的是如何开辟内存的
  • isa里存了些什么
  • 对象和类有什么样的关系