1:oc -> c/c++ -> 汇编语言 -> 机器语言
2:OC的对象和类zh主要是基于c和c++的什么数据结构实现的?结构体才能容纳不同类型
汇编语言是很依赖于硬件的 所以把oc文件转成c和c++文件时需要注意是哪个平台 window、mac、ios
模拟器(i386)、32bit(armv7)、64bit(arm64)
3:指定oc类文件转成c++文件:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的cpp文件
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
4:一个oc对象在内存中是如何布局的?
typedef struct objc_class *Class;
Class 是一个指针,在64位里面占8个字节,在32位里面占4个字节。
isa指针指向自己,这个地址就是这个结构体的地址。isa在内存中的地址,就是结构体在内存中的地址。具体详细解释请看链接https://blog.youkuaiyun.com/kesalin/article/details/7211228
5:一个nsobject对象占用多少内存?
系统分配了16个字节给NSobject对象(通过malloc_size函数获得),但是NSObject对象内部只使用了8个字节的空间(64位,可以根据class_getInstanceSize获得)
5.1:方法1
实际是16个字节。 跟平台有关。
苹果源码网址:
数字最大就是最新的。
5.2:方法2
1位十六进制数可以用4位二进制数标示,两个十六进制数代表8位二进制数,8位一个字节,
5.3 指令
6:一个继承自NSOject对象的Student占用多少内存?
注:内存对齐:结构体的最终大小必须是最大成员大小的倍数。(内存对齐详细说明连接)
6:一个person对象,一个student对象占用多少内存空间?
6.1:一个生命property的属性的student类,占据多少内存?
内存中 property会自动生成一个_height。
Student的实例对象里并未存储方法,而是存储的成员变量。可能是因为方法是一样的,成员变量是特有的。(方法是放在类对象的方法列表里)
7:
在ios堆空间里,创建的oc对象,给你分配内存,都是16的倍数,这是ios也有自己的分配内存的方式。:这个是malloc分配内存的方式,这样也就知道了malloc_size是多少了。当然内存分配方式有很多种(frozen_malloc,legacy_malloc,magazine_malloc,malloc,nano_malloc,purgeable_malloc),不仅仅是malloc方式分配,如果是内存比较小则用16的倍数方式分配,如果内存比较大,可能就会用其他的方式来分配。
7.1:
class_getInstanceSize (在程序运行期间 确定)名词意思是所有成员变量占用内存大小,再对齐,就是实例对象的大小。 这个跟sizeof(编译器就能确定)功能相同。这个是需要多少就够了。但是malloc是实际会分配多少内存。
8:GNU: gnu not unix.
www.gnu.org 下载glibc(gnu标准的c语言库 )