A-A+

OC对象的本质

博客主机

Objective-C的本质

  • 我们平时编写的Objective-C代码,底层实现其实都是C\C++代码
  • 所以Objective-C的面向对象都是基于C\C++的数据结构实现的
  • Objective-C的对象、类主要是基于C\C++的结构体实现的
  • 将Objective-C代码转换为C\C++代码 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o输出的cpp文件,(PS: 模拟器(i386)、32bit(armv7)、64bit(arm64))

一个OC对象在内存中的布局

  • NSObject的底层实现

代码获取内存大小

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>

struct NSObject_IMPL {
    Class isa; //8个字节
};

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

        //获得NSObject实例对象的成员变量所占用的大小 >>8
        NSLog(@"%zd",class_getInstanceSize([obj class]));

        //获得obj指针所指向内存的大小 >>16
        NSLog(@"%zd",malloc_size((__bridge const void *)(obj)));

    }
    return 0;
}

面试题

  • 一个NSObject对象占用多少内存

1、系统分配了16个字节给NSObject对象(通过malloc_size函数获得)

2、但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)

给我留言

Copyright © ios教程,苹果粉丝,苹果资讯,ios入门教程,ios学习,ios程序员,ios视频教程,ios粉丝网 保留所有权利.   Theme  Ality

用户登录