五、对象的本质和签名

本文由快学吧个人写作,以任何形式转载请表明原文出处。

一、如何了解对象的本质

oc的底层编译都会变成c和c++的代码,所以要了解对象的本质,就要看oc的代码被编译成了什么样的c或者c++的数据类型和结构。

二、创建一个新的mac项目

为什么选择mac的项目?因为mac的项目不会引入太多的UIKit框架的代码,在查看编译完成的代码的时候,更加的容易,又不会影响主要的探索目的。

创建如下的一个项目。最简单的定义一个类继承于NSObject。

三、使用Terminal终端,利用clang命令获得编译后的文件

clang命令 :

less 复制代码
//mac项目编译成c++文件
1、clang -rewrite-objc main.m -o main.cpp //将oc的.m文件编译成c++并输出.cpp文件。


//提示存在UIKit引用库的问题,用下面这个
2、clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk ViewController.m

//xcrun xcode的命令
3、xcrun -sdk iphonesimulator clang -rewrite-objc ViewController.m

4、xcrun -sdk iphones clang -rewrite-objc ViewController.m

上面是需要用到的一些clang的命令,因为我创建的是mac的项目,只有一个main.m,没有引入UIKit库,所以直接用第一条命令。

首先要进入main.m所在的项目文件夹,然后在使用第一个命令,不然找不到main.m的文件。

生成了main.cpp文件。打开main.cpp文件查找我们定义的JDMan。

可以看出,对象的本质是一个结构体。虽然我没有给JDMan定义成员变量或者属性,但是结构体中依然存在一个NSObject_IMPL,这个就是isa,是JDMan的父类NSobject自带的属性。如下图 :

所以,对象在编译后,实质上是结构体,并且会继承父类的属性。

四、属性和成员变量和实例变量之间的不同

以前经常会被问到属性和成员变量(实例变量)之间有什么不同,只知道不同点是 : 属性 = 成员变量 + getter + setter。

那么从编译后的源码中就可以找到证据。

添加属性和成员变量 :

clang进行编译,步骤如同上面。clang -rewrite-objc main.m -o main2.cpp生成main2.cpp文件。找到main函数上面,直接搜索int main(。

编译后的源码如下 :

如图中所写,这就是为什么说成员变量和实例变量与属性之间有不同。另外实例变量也是一种特殊的成员变量,一般对非基础类的、可以实例化的变量,会被叫做实例变量,例如 JDCar,而基础类的NSString虽然也是一种实例,但是这一类一般会被称作成员变量。

五、签名

属性是带有set和get方法的,那么它们的实现,在编译后会如下图所示(还是main2.cpp文件中) :

这里就是一个sel和imp的关系,函数名就是一个函数指针。里面的@16@0:8,这种东西叫函数签名。

具体的信息官方有官网文档,所以只解释一下这个签名的含义。

以@16@0:8举例 :

@是返回值的类型是id,16是指方法占用的总共的内存量,第二个@表示第一个参数类型是id,0是指第一个参数是从0位开始,: 表示第二个参数,8表示第二个参数从第8位开始。

相关推荐
aiopencode7 小时前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
奇牙coding8 小时前
GPT-5.5 报 401 invalid_api_key 怎么办?换密钥前按 4 层排查请求头、项目权限和端点
数据库·gpt·ios·ai
szp20059 小时前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift
二流小码农9 小时前
HarmonyOS开发助手,0代码让元服务从开发到上架
android·ios·harmonyos
zhongben123_14 小时前
从0到1开发一款生鲜配送APP:核心技术难点与架构避坑指南
大数据·运维·人工智能·ios·架构·web app
zhongben_keji15 小时前
批发商城APP怎么做:价格引擎、授信台账与资金合规的设计要点
ios·小程序·web app
茶底世界之下17 小时前
夜景加胶片颗粒,先看天空:Awaking 两版真实导出
ios
2501_9151063218 小时前
iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing
ide·vscode·ios·单元测试·个人开发·swift·敏捷流程
2501_9159214318 小时前
iOS 实时日志怎么看?KeyMob 的日志过滤、崩溃报告与符号化
android·ios·小程序·https·uni-app·iphone·webview
天蒙蒙亮18 小时前
打ios app包+“应用商城”发布
ios