OC对象的本质

  • 平时编写的OC代码,底层实现都是C/C++代码,编译器再将C/C++代码转化成汇编语言代码,再转化为机器语言代码(0/1),所以OC的面向对象都是基于C/C++的结构体数据结构实现的。
  • 不同平台支持的代码是不一样的,Windows、Mac、iOS,模拟器(i386)、32bit(armv7)、64bit(arm64)。
    模拟器:4s~5(i386),5以上(x86_64)
    真机:3gs~4s(armv7),5/5c(armv7s),5s以上(arm64)。
  • 将OC代码转化为C/C++代码:
    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的OC文件
  • 一个OC对象在内存中布局:
    NSObject的底层实现
@interface NSObject {        在内存中本质          struct NSObject_IMPL {
    Class isa;              ------------>               Class isa;                  
}                                                };
typedef struct objc_class *Class;  Class实际上是一个指向结构体的指针。
所以isa成员在64bit中占据8个字节的内存,结构体也即占8个字节。
isa在内存中的地址值就是结构体的地址值。
  • 一个OC对象占用内存大小:
创建一个实例对象,至少需要多少内存?
#import 
class_getInstanceSize([NSObject class])
创建一个实例对象,实际上系统分配了多少内存?
#import 
malloc_size((__bridge const void *)(obj))
 NSObject *obj = [[NSObject alloc] init];
        
 // 获得NSObject类的实例对象的大小
 NSLog(@"%zd",class_getInstanceSize([NSObject class])); // 8
 // 获得obj指针指向内存的大小
 NSLog(@"%zd",malloc_size((__bridge const void *)(obj))); // 16
  • 苹果源码下载: https://opensource.apple.com/tarballs/
  • 内存对齐:结构体的大小必须是最大成员大小的倍数。
  • 创建出来的实例对象,里面只存有它的成员变量,方法是不可能放在实例对象里面的,方法的实现都是一样的,只需要存在一份。

你可能感兴趣的:(OC对象的本质)