alloc & init & new 源码分析文章中,alloc有3个核心操作,其中一个就是obj->initInstanceIsa,即类与isa绑定。主要理解类与isa是如何关联的。
objc4中分析obj->initInstanceIsa源码
探索对象本质
- 在main中自定义一个类ZMPerson,有一个属性name
#import <Foundation/Foundation.h>
@interface ZMPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
@implementation ZMPerson
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
}
return 0;
}
- 通过终端,利用clang将main.m编译成 main.cpp,有以下几种编译命令,这里使用的是第一种
//1、将 main.m 编译成 main.cpp
clang -rewrite-objc main.m -o main.cpp
//2、将 ViewController.m 编译成 ViewController.cpp clang -rewrite-objc
-fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.7.sdk
ViewController.m
//以下两种方式是通过指定架构模式的命令行,使用xcode工具 xcrun
//3、模拟器文件编译
- xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
//4、真机文件编译
- xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp
Clang
clang是一个由Apple主导编写,基于LLVM的C/C++/OC的编译器
主要是用于底层编译,将一些文件``输出成c++文件,例如main.m 输出成main.cpp,
其目的是为了更好的观察底层的一些结构 及 实现的逻辑,方便理解底层原理。
ZMPerson 的定义
- 打开编译好的main.cpp,找到ZMPerson 的定义
// ZMPerson的底层编译
struct ZMPerson_IMPL {
struct NSObject_IMPL NSObject_IVARS; // isa
NSString *_name;
};
//NSObject 的底层编译