iOS中类、对象的本质

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/IOSSHAN/article/details/88941495

我们都知道Object-C是在C\C++的基础上演化而来的,即Object-C底层还是C\C++,然后再经过汇编转换成机器语言,最后被计算机CPU所识别。

那么,我们平时写的类、对象会转换成C\C++什么数据结构类型呢?

首先,我们新建一个项目,并在项目中简单写上

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
    }
    return 0;
}

通过点击NSObject可以进入其定义头文件中,可以发现NSObject的定义是:

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

简化后,NSObject的定义可以写成如下格式

@interface NSObject {
    Class isa  OBJC_ISA_AVAILABILITY;
}

通过头文件观察,并不能够观察出什么,然后我们借助clang编译器指令:clang -rewrite-objc main.m -o main.cpp
该指令可以将main.m文件转换为C\C++代码main.cpp。

其中,rewrite-objc是重写objc语言;main.m是需要重写的文件;-o 是输出;main.cpp输出目标文件

更多学习关于clang常用语法介绍

以上转换方式,只是单存的转换为C\C++代码,并没有指明编译平台,对此,我们可以使用xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp将main.m文件转换为iphoneos下的arm64平台下的.cpp文件。该指令会对原有指令进行响应优化。

其中xcrun是xcode run的意思;-sdk iphoneos是编译在iphoneos平台;在-arch arm64中arch是architectures构架的意思,arm64是苹果所用的构架中的一种其他还包括:arm7、arm7s等
更多学习关于iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么

在转化完的main.cpp文件中,我们可以找到如下代码:

其中,IMPL为implementation;NSObject_IMPL即为NSObject的实现
Class的定义为typedef struct objc_class *Class;,其为一个指向结构体类型的指针。

因此,NSObject对象,在定义为

@interface NSObject {
    Class isa  OBJC_ISA_AVAILABILITY;
}

格式的情况下,通过内部一系列操作,最终转换为C\C++底层的代码为:

struct NSObject_IMPL {
	Class isa;
};

通过观察可知NSObject_IMPL为一个结构体。
因此,NSObject对象底层实际上是一个内部有一个isa指针的结构体

猜你喜欢

转载自blog.csdn.net/IOSSHAN/article/details/88941495