美文网首页
01.Objective-C 对象 本质

01.Objective-C 对象 本质

作者: ProfessorFan | 来源:发表于2021-01-04 18:40 被阅读0次

问题

  1. 将Objective-C 代码转化为C/C++代码
  2. OC对象的本质
  3. 创建一个实例对象,至少需要多少内存?
  4. 创建一个实例对象,实际分配了多少内存?

实践

  1. 将Objective-C 代码转化为C/C++代码
# xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc Objective-C源文件 -o 目标c或者cpp 文件

例如:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main_arm64.cpp

可能会遇到如下问题:
xcrun: error: SDK "iphoneos" cannot be located
main.m:8:9: fatal error: 'Foundation/Foundation.h' file not found
#import <Foundation/Foundation.h>
        ^~~~~~~~~~~~~~~~~~~~~~~~~
main.m:8:9: note: did not find header 'Foundation.h' in framework 'Foundation' (loaded from '/System/Library/Frameworks')
1 error generated.

解决方案:
# 给Xcode命令行工具指定路径
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/

转化前的OC文件如下

@interface ClassA : NSObject

@property (nonatomic,strong)NSString *name;  // 8bit



@end

@implementation ClassA
{
    int _age;  // 4bit
//    int _num;  // 4bit;
//    long _num1; // 8bit
//    int *p;    // 8 bit
//    long array[20]; //160 bit
}


@end

转化后的cpp 文件如下:

struct ClassA_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    int _age;
    NSString *_name;
};

  1. OC对象的本质
    根据上面的案例我们就可以得到OC 对象的本质就是一个结构体

  2. 创建一个实例对象,至少需要多少内存?

#import <objc/runtime.h>
class_getInstanceSize([NSObject class])

# 案例:
@interface Person:NSObject
{
  int _age;  // 4bit
 int _height; // 4bit
int *p; //8bit
}

class_getInstanceSize([Person class]) 这个函数的结果是 24;



@end
  1. 创建一个实例对象,实际分配了多少内存?
#import <malloc/malloc.h>
NSObject *obj = [NSObject new];
malloc_size((__bridge const void *)obj);

# 案例:
@interface Person:NSObject
{
  int _age;  // 4bit
 int _height; // 4bit
int *p; //8bit
}

Person *person = [Person new];
malloc_size((__bridge const void *)person); 这个函数的结果是 32;

# 这里结果是 32 是因为apple 源码中定义了 内存块 必须是16的倍数 
例如:16,32,48,64....


相关文章

  • 01.Objective-C 对象 本质

    问题 将Objective-C 代码转化为C/C++代码 OC对象的本质 创建一个实例对象,至少需要多少内存? 创...

  • OC 与 Swift

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象的本质(中)—— OC对象的种类

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象的本质(下)—— 详解isa&supercl

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象原理探究(下)

    介绍正文前,我们思考一个问题,什么是对象?或者说OC对象的本质是什么? 对象本质以及拓展 在探索oc对象本质前,先...

  • iOS底层 - 对象的本质,方法的本质

    对象的本质是结构体 方法的本质是消息发送 对象的本质 首先有一个SPPerson对象 我们知道OC底层是C和C++...

  • block 笔记

    block本质是OC对象(封装了函数调用以及调用环境的OC对象) 本质

  • OC 对象本质

    一个 NSObject 对象占用多少内存? 对象的 isa 指针指向哪里? OC的类信息存放在哪里? 第一个问题就...

  • OC 对象本质

    1 . 编写的Objective-C代码,其底层都是由c/c++ 代码实现的。OC语言 —> c/c++ 语言—>...

  • OC 对象本质

    我们平时编写的OC代码,底层都是C/C++代码Object-C --> c/c++ --> 汇编语言 --> 机器...

网友评论

      本文标题:01.Objective-C 对象 本质

      本文链接:https://www.haomeiwen.com/subject/fqfvoktx.html