isa与类关联的原理

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 的底层编译
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值